php安全编程
话不多说,为了确保web内容的安全,这里有一些常规的安全标准准则:
1.不相信表单
攻击表单其实很简单,如果有人在他们的浏览器去关闭了JS功能,你的客户端验证就失败了。
用户在很大程度上都是通过表单和后台进行交互,因此表单是最大的安全风险,围绕着表单产生的攻击很多,像mysql注入攻击,XSS等,我们一定要在后端去验证传递给脚本的数据。
2.不相信任何用户
表单的操纵者,这点无需多言!
3.关闭全局的变量
有时候其实最大的安全漏洞是启用了register_globals配置参数,幸运的是PHP4.2版本之后默认是关闭了这个选项,但还是不得不防,如果一个服务器启用了全局变量,会自动的为全局变量赋予任何形式的参数。
<input name='username' type='text'>
假如说运行上述代码,启动了register_globals的PHP会将参数赋值到$username中,虽然看起来比$_POST['username']更为简单,但是安全问题突出,php会设置该变量的值为通过GET或者POST的参数发送到脚本的任何值。
1 if(auth()){ 2 $auth_flag=1; 3 }
正常的情况下是,只有通过了auth函数的检验,$auth_flag为1,但是如果register_globals启用,任何人可以通过GET参数$auth_flag=1去覆盖它,从而失去验证的意义。所以我们应该从预定义的$_POST数组去取变量信息,文件上传的信息保存在$_FILES数组中,如果不清楚method,可以通过$_REQUEST去获取。
$_REQUEST是$_GET,$_POST,$_COOKIE数组的结合,默认的顺序是cookie,post,get。
4.一些安全的配置选项
明显的用于生产服务器上的。
register_globals=off
safe_mode=off
error_reporting=off,生产服务器使用错误日志
停用这些函数:system(),exec(),passthru(),shell_exec()..
expose_php=off 该功能会向Apache头部添加PHP的版本信息
5.sql注入攻击
通过在参数中插入有害的sql代码片段,进行服务器的攻击
例如:假如我们从表单取一个name变量,去mysql服务器查询,构造如下的sql
$sql="select * from table where name='$name'";
对于这样,我们应该先去转义一下,trim,addslashes,htmlspecialchars,等,也许有人会把$name变成如下信息:
tianye';drop table;
一般来说,防止sql注入的方法有一下几种:
(1)密码比对->通过用户名查询到密码,然后将该密码于用户输入的密码进行匹配。
(2)总是对数据进行addslashes或者mysql_real_escape_string转义。
(3)使用预处理的方式进行查询
6.基本的XSS攻击
xss表示跨站脚本攻击,该漏洞发生在客户端,最常见的形式是在用户提交的内容中放入js脚本以便获取用户cookie中的数据,由于大部分网站以cookie或者session来验证用户,所以偷取的信息可用户模拟用户。
对于此类攻击最常见的预防方式是便是转换实体,使用如下函数,trim,utf8_decode,htmlspecialchars,htmlentities,将脚本里的htm标签转化为实体,不被浏览器渲染。虽然这样会预防大部分的攻击,但是一些xss攻击者会用16进制货值utf编码来攻击,他们在url的get参数中发送编码,让浏览器运行16进制的代码,浏览器一运行将得到类似<script>....</script>等的注入代码,为了防止,我们需要将16进制中的#,$等转换为他们对应的实体。