PHP 预防CSRF、XSS、SQL注入攻击

1.服务端进行CSRF防御
服务端的CSRF方式方法很多样,但总的思想都是一致的,就是在客户端页面增加伪随机数。
(1).Cookie Hashing(所有表单都包含同一个伪随机值):
这可能是最简单的解决方案了,因为攻击者不能获得第三方的Cookie(理论上),所以表单中的数据也就构造失败了
(2).验证码
  这个方案的思路是:每次的用户提交都需要用户在表单中填写一个图片上的随机字符串,厄....这个方案可以完全解决CSRF,但个人觉得在易用性方面似乎不是太好,还有听闻是验证码图片的使用涉及了一个被称为MHTML的Bug,可能在某些版本的微软IE中受影响。
(3).One-Time Tokens(不同的表单包含一个不同的伪随机值)
  在实现One-Time Tokens时,需要注意一点:就是“并行会话的兼容”。如果用户在一个站点上同时打开了两个不同的表单,CSRF保护措施不应该影响到他对任何表单的提交。考虑一下如果每次表单被装入时站点生成一个伪随机值来覆盖以前的伪随机值将会发生什么情况:用户只能成功地提交他最后打开的表单,因为所有其他的表单都含有非法的伪随机值。必须小心操作以确保CSRF保护措施不会影响选项卡式的浏览或者利用多个浏览器窗口浏览一个站点。

2.预防xss攻击
php防止XSS跨站脚本攻击的方法:是针对非法的HTML代码包括单双引号等,使用htmlspecialchars()函数 。
在使用htmlspecialchars()函数的时候注意第二个参数, 直接用htmlspecialchars($string) 的话,第二个参数默认是ENT_COMPAT,函数默认只是转化双引号(“), 不对单引号(‘)做转义

3.预防sql注入
1、php.ini 中把 safe_mode 打开
2、 safe_mode_gid = off
3、 关闭危险函数  disable_functions = chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen,unlink,delete,copy,mkdir, rmdir,rename,file,file_get_contents,fputs,fwrite,chgrp,chmod,chown
4、 关闭PHP版本信息在http头中的泄漏   expose_php = Off
5、 打开magic_quotes_gpc来防止SQL注入   magic_quotes_gpc = On  这个默认是关闭的,如果它打开后将自动把用户提交对sql的查询进行转换  比如把 ' 转为 \'等,这对防止sql注射有重大作用
6、错误信息控制  error_reporting = E_WARNING & E_ERROR 只显示警告以上
7、 错误日志  建议在关闭display_errors后能够把错误信息记录下来,便于查找服务器运行的原因  log_errors = On
error_log = D:/usr/local/apache2/logs/php_error.log
8、if (!get_magic_quotes_gpc()) {
$lastname = addslashes($_POST[‘lastname’]);
} else {
$lastname = $_POST[‘lastname’];
}
get_magic_quotes_gpc 过滤后不用 addslashes 以免重复过滤
<?php     
     function   post_check( $post )    
     {    
     if   (!get_magic_quotes_gpc())  // 判断magic_quotes_gpc是否为打开    
     {    
     $post   addslashes ( $post );  // 进行magic_quotes_gpc没有打开的情况对提交数据的过滤    
     }    
     $post   str_replace ( "_" "\_" $post );  // 把 '_'过滤掉    
     $post   str_replace ( "%" "\%" $post );  // 把' % '过滤掉    
     $post   nl2br ( $post );  // 回车转换    
     $post = htmlspecialchars( $post );  // html标记转换       
     return   $post ;    
     }    
     ?>
关于SQL注入,不得不说的是现在大多虚拟主机都会把magic_quotes_gpc选项打开,在这种情况下所有的客户端GET和POST的数据都会自动进行addslashes处理,所以此时对字符串值的SQL注入是不可行的,但要防止对数字值的SQL注入,如用intval()等函数进行处理

猜你喜欢

转载自blog.csdn.net/only_xiaohang/article/details/80914160