找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3140|回复: 0

php安全防护的思考

[复制链接]
发表于 2012-1-20 11:22:15 | 显示全部楼层 |阅读模式
网络安全的残酷现实,我就不多说了。写出合格的代码的人才是合格的程序员。合格的代码无非三点:安全,效率,维护性。
安全当然要排第一位,一个错误百出的程序,再快在帅都是没有用的。效率可以优化,维护性可以通过不断的重构来解决。
这里我就只关注安全性了。

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点,可以保证用户访问的资源是允许访问的,访问的参数是受控的,而且就算服务器有什么异常,也不会让客户端知道细节。
作者:shyandsy 发表于2012-1-20 9:35:42 原文链接

您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-5-3 11:10 , Processed in 0.024809 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表