登陆框:用户名,密码
登陆判断程序如下: $nickname=$_POST['username'];
 $password=$_POST['password'];
 $password=sha1($password);
 $sql="select * from regist where name='$nickname' and password1='$password'";
 echo $sql;
 $re=mysql_query($sql,$conn); $result=mysql_fetch_array($re);当我输入
用户名:1' or '1'='1' or '1'='1
密码:123echo $sql的结果为:
select * from regist where name='1\' or \'1\'=\'1\' or \'1\'=\'1' and password1='40bd001563085fc35165329ea1ff5c5ecbdbbeef'分号都被转义了,这是PHP默认字符串分号转义,如何在不修改PHP默认设置时,构建一个有效的注入式SQL呢?

解决方案 »

  1.   

    在运行时关闭字符转义
    if (get_magic_quotes_gpc()) {
        function stripslashes_deep($value)
         {
            $value = is_array($value) ?
             array_map(’stripslashes_deep’, $value) :
             stripslashes($value);         return $value;
        }     $_POST = array_map(’stripslashes_deep’, $_POST);
         $_GET = array_map(’stripslashes_deep’, $_GET);
         $_COOKIE = array_map(’stripslashes_deep’, $_COOKIE);
    }
      

  2.   

    手册上都有例子,写的明明白白。
    <?php
    function stripslashes_deep($value)
    {
        $value = is_array($value) ?
                    array_map('stripslashes_deep', $value) :
                    stripslashes($value);    return $value;
    }// Example
    $array = array("f\\'oo", "b\\'ar", array("fo\\'o", "b\\'ar"));
    $array = stripslashes_deep($array);// Output
    print_r($array);
    ?>  上例将输出:Array
    (
        [0] => f'oo
        [1] => b'ar
        [2] => Array
            (
                [0] => fo'o
                [1] => b'ar
            ))
     
      

  3.   


    我是指在不修改PHP页面的情况下,构建有效的SQL注入语句
      

  4.   

    你的意思是不是说:一些特殊字符破坏了你的SQL语句?我这有个办法你可以试一试,就是把容易转义的特殊字符用HTML的tag替换。然后再执行SQL。
    这样:
         一。保证了正确的执行SQL语句,
         二。当再次调用数据的时候。那些HTML tag又能自动转换成相应的字符。希望下面的代码能帮到你: $pattern = array("\"", "“", "”", "'", "‘", "’");
     $replace = array("&quot", "&ldquo", "&rdquo", "&apos", "&lsquo", "&rsquo");
    $nickname = str_replace ($pattern, $replace, $_POST['username']); 双引号    " 对应 &quot
    左双引号 “ 对应 &ldquo
    右双引号  ”对应 &rdquo
    单引号    ' 对应 &apos
    左单引号 ‘ 对应 &lsquo
    右单引号  ’对应 &rsquo
    还有其他的一些特殊的HTML转义字符。你可以查看下面的链接:
    http://liudaoru.javaeye.com/blog/160679
    或者自己搜索一下。 希望我对你的问题没有理解错误。
      

  5.   

    不filter html实体?把输入改成1&#39; or &#39;1&#39;=&#39;1&#39; or &#39;1&#39;=&#39;1filter够写好几百行代码的,尽量别用addslashes,用mysql_real_escape_string