欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > php >内容正文

php

强大的PHP防SQL注入类,可以过滤敏感参数

发布时间:2025/3/19 php 50 豆豆
生活随笔 收集整理的这篇文章主要介绍了 强大的PHP防SQL注入类,可以过滤敏感参数 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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

  • SQL注入攻击的总体思路

  • 发现SQL注入位置;

  • 判断后台数据库类型;

  • 确定XP_CMDSHELL可执行情况

  • 发现WEB虚拟目录

  • 上传ASP,php,jsp木马;

  • 得到管理员权限;

贴代码:

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

 

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

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

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

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

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

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

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

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

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

转载于:https://www.cnblogs.com/fx2008/archive/2013/03/22/2974880.html

总结

以上是生活随笔为你收集整理的强大的PHP防SQL注入类,可以过滤敏感参数的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。