不用想办法屏蔽,,只要把PHP的版本换成最新的就成了。

解决方案 »

  1.   

    找到解决办法了
    一个值得注意的安全问题 关键词:PHP 本文要特别感谢网友SUKER,^_^ 
    -------------------------------------------------------------------------------- 本文只举一个MySQL登陆验证的例子,通过这个例子,我希望大家能够特别注意一点:在作系统 
    的时候,请不要忽略程序中的安全渥洞. MySQL表结构: 
    create table login(user varchar(20) not null primary key,pass varchar(50)); 
    insert into login values('test',password('test')); 具有安全渥洞的程序如下(login.php): 
    <? 
    if($login){ 
    $con = mysql_connect("localhost","test","") or die("无法连接服务器"); $sql = "select * from login where user='$user' and pass=password('$pass')"; 
    $rst = mysql_db_query("test",$sql,$con) or die("$sql出错"); 
    if(mysql_num_rows($rst)==1) echo "验证成功"; 
    else echo "验证失败"; 
    mysql_free_result($rst); mysql_close($con); 

    else{ 
    echo "<html>".chr(13); 
    echo "<body>".chr(13); 
    echo "<form action=\"$PHP_SELF\" method=\"POST\">".chr(13); 
    echo "用户名:<input type=\"text\" name=\"user\"><br>".chr(13); 
    echo "密 码:<input type=\"password\" name=\"pass\"><br>".chr(13); 
    echo "<input type=\"submit\" name=\"login\" value=\"验证\">".chr(13); 
    echo "</form>".chr(13); 
    echo "</body>".chr(13); 
    echo "</html>".chr(13); 

    ?> 程序看起来完全没有错误,但是当您作了下面的测试的时候,您就会知道了: 
    用户名:any' or '1'='1' or ('2'='2 
    密 码:any')) or ('3'='3 
    当您的PHP配置文件中的magic_quotes_gpc为Off的时候,输出是"验证成功",也就是说不需要 
    知道用户名和密码就可以通过验证了,这不是很可怕吗?其实您分析一下这时产生的$sql就知 
    道了: 
    select * from login where user='any' or '1'='1' or ('2'='2' and pass=password('any')) or ('3'='3') 有两种解决方法(推荐第2种): 
    1. 直接将PHP配置文件中的magic_quotes_gpc设成On 
    2. 写一个函数gpc2sql,所有从GET/POST/Cookie中来的并且用在SQL中的变量都用这个函数 
    先作处理: 
    <? 
    function gpc2sql($str){ 
    if(get_magic_quotes_gpc()==1) return $str; 
    else return addslashes($str); 

    ?> 
      

  2.   

    当然这就说到了另外一个问题,任何一个查询字符串,如果要查询的串里面有" or ' or \这三个符号则先要用addslashes来处理,这里也是运用这个原理来填补漏洞的。
      

  3.   

    不是登陆验证的问题,而是登陆的这种验证思路使用户名和密码必然成为sql语言的一部分。
    我想asp也会有这样的问题吧?
      

  4.   

    真希望有达人来说说sql攻击啊。
      

  5.   

    ASP有这种情况,用两个OR就可登录,在PHP中你可以做两次判断
    $r = myslq_fetch_row($result)
    if(!($name ==$r[0]))
    {
       if(($pass == $r[1]))
    {
       echo"用户名不正确";
    }
    if(!($pass == $r[1]))
    {
     .................以下大同小异了
    .................
    }
    这样在验证时只有在数据库中相应的值才可以测试通过吧。
      

  6.   

    不允许空格和引号,那么你是怎么做的呢?
     谢谢yaoxuefeng(锋雨者) 。
      

  7.   

    我主要是想看看大家讨论一下
    原来那个asp板有个sql攻击的帖子怎么找不见了啊。