zoukankan      html  css  js  c++  java
  • 强大的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
    }
  • 相关阅读:
    spring-boot-route(七)整合jdbcTemplate操作数据库
    spring-boot-route(六)整合JApiDocs生成接口文档
    spring-boot-route(五)整合Swagger生成接口文档
    spring-boot-route(四)全局异常处理
    spring-boot-route(三)实现多文件上传
    spring-boot-route(二)读取配置文件的几种方式
    spring-boot-route(一)Controller接收参数的几种方式
    国庆,要干几件大事
    栈与队列简介
    一文了解Zookeeper
  • 原文地址:https://www.cnblogs.com/fx2008/p/2974880.html
Copyright © 2011-2022 走看看