首页 >后端开发 >php教程 >php简单的参数过滤代码学习

php简单的参数过滤代码学习

WBOY
WBOY原创
2016-07-25 08:58:421195浏览
  1. /**
  2. * 参数过滤代码
  3. * edit bbs.it-home.org
  4. */
  5. if (@get_magic_quotes_gpc ()) {
  6. $_GET = sec ( $_GET );
  7. $_POST = sec ( $_POST );
  8. $_COOKIE = sec ( $_COOKIE );
  9. $_FILES = sec ( $_FILES );
  10. }
  11. $_SERVER = sec ( $_SERVER );
  12. function sec(&$array) {
  13. //如果是数组,遍历数组,递归调用
  14. if (is_array ( $array )) {
  15. foreach ( $array as $k => $v ) {
  16. $array [$k] = sec ( $v );
  17. }
  18. } else if (is_string ( $array )) {
  19. //使用addslashes函数来处理
  20. $array = addslashes ( $array );
  21. } else if (is_numeric ( $array )) {
  22. $array = intval ( $array );
  23. }
  24. return $array;
  25. }
  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. function str_check($str) {
  18. if (inject_check ( $str )) {
  19. die ( '非法参数' );
  20. }
  21. //注入判断
  22. $str = htmlspecialchars ( $str );
  23. //转换html
  24. return $str;
  25. }
  26. function search_check($str) {
  27. $str = str_replace ( "_", "_", $str );
  28. //把"_"过滤掉
  29. $str = str_replace ( "%", "%", $str );
  30. //把"%"过滤掉
  31. $str = htmlspecialchars ( $str );
  32. //转换html
  33. return $str;
  34. }
  35. //表单过滤函数
  36. function post_check($str, $min, $max) {
  37. if (isset ( $min ) && strlen ( $str ) die ( '最少$min字节' );
  38. } else if (isset ( $max ) && strlen ( $str ) > $max) {
  39. die ( '最多$max字节' );
  40. }
  41. return stripslashes_array ( $str );
  42. }
  43. ?>
复制代码

当输入的参数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注入漏洞。

附上一个防止sql注入的函数:

  1. //防注入函数
  2. function inject_check($sql_str) {
  3. return eregi ( 'select|inert|update|delete|'|/*|*|../|./|UNION|into|load_file|outfile', $sql_str );
  4. // 进行过滤,防注入 bbs.it-home.org
  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;
  15. }
  16. ?>
复制代码


声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn