首页 > 代码库 > php安全编程

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进制中的#,$等转换为他们对应的实体。

php安全编程