我主要想让大家挑挑这段代码功能上的不足,谢谢<?php
//SQL注入检测过滤程序代码:foreach ($_GET as $get_key=>$get_var) 

if (is_numeric($get_var)) { 
$get[strtolower($get_key)] = get_int($get_var); 
} else { 
$get[strtolower($get_key)] = get_str($get_var); 
$get[strtolower($get_key)]=str_replace("%","\%",$get[strtolower($get_key)]);
$get[strtolower($get_key)]=trim($get[strtolower($get_key)]);


/* 过滤所有POST过来的变量 */ 
foreach ($_POST as $post_key=>$post_var) 

if (is_numeric($post_var)) { 
$post[strtolower($post_key)] = get_int($post_var); 
} else { 
$post[strtolower($post_key)] = get_str($post_var); 


/* 过滤函数 */ 
//整型过滤函数 
function get_int($number) 

return intval($number); 

//字符串型过滤函数 
function get_str($string) 

if (!get_magic_quotes_gpc()) { 
return addslashes($string); 

return $string; 
} //SQL注入检测过滤程序代码 END?>

解决方案 »

  1.   

    if (!get_magic_quotes_gpc()) {  
    return addslashes($string);  
    }
    sql可快应该不会被注入
      

  2.   

    先不说注入, 
    你的代码本身就有些地方需要多考虑,比如,id=9.5, 你过滤后成了9, 
    code=0x4, 你过滤后成了0
    ....等另外,get/post都是可以输入数组的, 但是显然你都过滤成了字符串....------------------再说注入, 
    其实防注入更主要的地方是sql的写法比如说:
    xxx.php?id=3 你得到 $id=3然后你写
    select * from xxx where id={$id} 然后别人输入  xxx.php?id=3+or+1你的过滤没有改变它于是sql成了 select * from xxx where id=3 or 1所有的记录都将返回(虽然这不一定造成什么后果,但是过滤没有起作用)--------------------------------------------------关于注入和addslashes,1.个人不建议使用addslashes对post/get做处理,因为输出时需要转回头,很烦,
    有时数据压根不会进sql, 所以没必要
    我的做法是保持输入字符串原样,在sql语句里做mysql_real_escape_string2.对输入的类型和值范围做严格检查,
    比如该输入id的地方,intval($_GET['id']), 
    不是根据输入的值判断,而是根据你要如何使用它判断
    一个id,不能因为别人输入了string,你就当string处理一个性别id, 如果1=男,2=女,那么别人输了3, 也要过滤掉
      

  3.   

    预防数据库攻击的正确做法:
    <?php
    function check_input($value)
    {
    // 去除斜杠
    if (get_magic_quotes_gpc())
      {
      $value = stripslashes($value);
      }
    // 如果不是数字则加引号
    if (!is_numeric($value))
      {
      $value = "'" . mysql_real_escape_string($value) . "'";
      }
    return $value;
    }$con = mysql_connect("localhost", "hello", "321");
    if (!$con)
      {
      die('Could not connect: ' . mysql_error());
      }// 进行安全的 SQL
    $user = check_input($_POST['user']);
    $pwd = check_input($_POST['pwd']);
    $sql = "SELECT * FROM users WHERE
    user=$user AND password=$pwd";mysql_query($sql);mysql_close($con);
    ?>