当前位置:首页 > PHP教程 > php应用 > 列表

PHP整站防注入程序

发布:smiling 来源: PHP粉丝网  添加日期:2014-08-23 13:25:33 浏览: 评论:0 

这是一个考虑比较全面的php和sql结合的防注入程序,在php方便主要对get,post,cooke,files进行了过滤,在sql中我们就对delete,update一些查询命令进行检测过滤.

SQL注入攻击的总体思路

·发现SQL注入位置;·判断后台数据库类型;·确定XP_CMDSHELL可执行情况·发现WEB虚拟目录·上传ASP,php,jsp木马;·得到管理员权限;

PHP整站防注入程序实例代码如下:

  1. <?PHP  
  2. //PHP整站防注入程序,需要在公共文件中require_once本文件  
  3. //判断magic_quotes_gpc状态 
  4.  
  5.  代码如下 复制代码  
  6. if (@get_magic_quotes_gpc ()) {  
  7. $_GET = sec ( $_GET );  
  8. $_POST = sec ( $_POST );  
  9. $_COOKIE = sec ( $_COOKIE );  
  10. $_FILES = sec ( $_FILES );  
  11. }  
  12. $_SERVER = sec ( $_SERVER );  
  13. function sec(&$array) {  
  14. //如果是数组,遍历数组,递归调用  
  15. if (is_array ( $array )) {  
  16. foreach ( $array as $k => $v ) {  
  17. $array [$k] = sec ( $v );  
  18. //开源代码phpfensi.com 
  19. else if (is_string ( $array )) {  
  20. //使用addslashes函数来处理  
  21. $array = addslashes ( $array );  
  22. else if (is_numeric ( $array )) {  
  23. $array = intval ( $array );  
  24. }  
  25. return $array;  
  26. }?> 

1、整型参数的判断

当输入的参数YY为整型时,通常abc.asp中SQL语句原貌大致如下:

select * from 表名 where 字段=YY,所以可以用以下步骤测试SQL注入是否存在。 

①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(附加一个单引号),此时abc.ASP中的SQL语句变成了 

select * from 表名 where 字段=YY’,abc.asp运行异常; 

②HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=1,abc.asp运行正常,而且与HTTP://xxx.xxx.xxx/abc.asp?p=YY运行结果相同; 

③HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=2,abc.asp运行异常; 

如果以上三步全面满足,abc.asp中一定存在SQL注入漏洞.

综合上面我们写一个整型过滤函数,代码如下:

  1. function num_check($id) {  
  2. if (! $id) {  
  3. die ( '参数不能为空!' );  
  4. //是否为空的判断  
  5. else if (inject_check ( $id )) {  
  6. die ( '非法参数' );  
  7. //注入判断  
  8. else if (! is_numetic ( $id )) {  
  9. die ( '非法参数' );  
  10. }  
  11. //数字判断  
  12. $id = intval ( $id );  
  13. //整型化  
  14. return $id;  
  15.  
  16.  
  17. //字符过滤函数  
  18. function str_check($str) {  
  19. if (inject_check ( $str )) {  
  20. die ( '非法参数' );  
  21. }  
  22. //注入判断  
  23. $str = htmlspecialchars ( $str );  
  24. //转换html  
  25. return $str;  
  26. }  
  27. function search_check($str) {  
  28. $str = str_replace ( "_""_"$str );  
  29. //把"_"过滤掉  
  30. $str = str_replace ( "%""%"$str );  
  31. //把"%"过滤掉  
  32. $str = htmlspecialchars ( $str );  
  33. //转换html  
  34. return $str;  
  35. }  
  36. //表单过滤函数  
  37. function post_check($str$min$max) {  
  38. if (isset ( $min ) && strlen ( $str ) < $min) {  
  39. die ( '最少$min字节' );  
  40. else if (isset ( $max ) && strlen ( $str ) > $max) {  
  41. die ( '最多$max字节' );  
  42. }  
  43. return stripslashes_array ( $str );  

当输入的参数YY为字符串时,通常abc.asp中SQL语句原貌大致如下:

select * from 表名 where 字段='YY',所以可以用以下步骤测试SQL注入是否存在。 

①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(附加一个单引号),此时abc.ASP中的SQL语句变成了 

select * from 表名 where 字段=YY’,abc.asp运行异常; 

②HTTP://xxx.xxx.xxx/abc.asp?p=YY&;nb ... 39;1'='1',abc.asp运行正常,而且与HTTP://xxx.xxx.xxx/abc.asp?p=YY运行结果相同; 

③HTTP://xxx.xxx.xxx/abc.asp?p=YY&;nb ... 39;1'='2',abc.asp运行异常; 

如果以上三步全面满足,abc.asp中一定存在SQL注入漏洞,代码如下:

  1. //防注入函数  
  2. function inject_check($sql_str) {  
  3. return eregi ( 'select|inert|update|delete|'|/*|*|../|./|UNION|into|load_file|outfile', $sql_str );  
  4. // www.phpfensi.com 进行过滤,防注入  
  5.  
  6. function stripslashes_array(&$array) {  
  7. if (is_array ( $array )) {  
  8. foreach ( $array as $k => $v ) {  
  9. $array [$k] = stripslashes_array ( $v );  
  10. }  
  11. else if (is_string ( $array )) {  
  12. $array = stripslashes ( $array );  
  13. }  
  14. return $array;  

好了文章介绍到的防注入也算是比较全面的,大家可以测试或更出更好的方法.

Tags: PHP整站防注入 PHP防注入

分享到: