php安全防护的思考

网络安全的残酷现实,我就不多说了。写出合格的代码的人才是合格的程序员。合格的代码无非三点:安全,效率,维护性。

安全当然要排第一位,一个错误百出的程序,再快在帅都是没有用的。效率可以优化,维护性可以通过不断的重构来解决。

这里我就只关注安全性了。


PHP也学了2个多月了。做了一个信息管理系统,作为我的第一个学习研究项目。PHP在服务器端做webservice,客户端HTML+JS通过POST json来和服务器通信和交互。

对于客户端输入,虽然我做了各种过滤处理,但还是心理不踏实。没有一个系统的防护方案,出了问题都不知道怎么解决,一个一个查是很不靠谱的。

所以写这篇文章给自己理理思路。


1.定义暴漏给外部的资源,客户端只能访问允许访问的资源

针对web的资源请求都是url来完成的。这是网络程序要处理的第一步。我们要做的就是明确定义私有资源和公有资源。私有资源不允许URL访问。只对客户端开放与服务有关的接口,必须访问的资源。暴漏的接口越少,越安全。

比如说,我的程序只对客户端暴漏一个接口,就是service.php。那么多有对别的路径的访问就都是非法的。


2.定义所有接口的参数,并做严格的检查

既然有了公有资源,那么针对每一个公有资源,都要明确其提供的服务和相应参数。服务就是说这个资源提供什么功能给客户端,比如返回当前所有文章名。参数规定了这个资源允许的参数名,参数意义,参数类型,参数允许的字符集合(包含两层意思,第一字符集编码unicode或者ansi或者gbk,第二允许的字符,比如数字,字母)。


3.不能让客户端看到任何不友好的错误信息

不友好的错误信息,在我理解,其实就是指那么不是我的代码抛出的错误。比如,运行期间mysql执行抛出一个错误,直接显示到客户端,这不是直接告诉客户端电脑前的人,服务器端有问题么,而且有可能让别人知道具体问题在哪里。所以调试版和运行版本应该区别对待。调试阶段,为了快速解决问题,可以临时把错误信息直接输出到客户端,但这绝对不是什么好事。为了不让客户端显示意外的错误信息,需要用try{。。。}catch{。。。}结构块来捕获所有的可能的错误。try。。catch捕获到错误以后,将所有现场变量和错误信息写入错误日志,以供后续分析。


做到以上3点,可以保证用户访问的资源是允许访问的,访问的参数是受控的,而且就算服务器有什么异常,也不会让客户端知道细节。

阅读更多
换一批

没有更多推荐了,返回首页