我在网上搜了几断代码,请大家评评哪个较好?一起使用如何?//然后在每个php文件前加include(“checkpostandget.php“);即可//要过滤的非法字符 $ArrFiltrate=array("\'\'",";","union"); //出错后要跳转的url,不填则默认前一页 $StrGoUrl=""; //是否存在数组中的值 function FunStringExist($StrFiltrate,$ArrFiltrate){ foreach ($ArrFiltrate as $key=>$value){ if (eregi($value,$StrFiltrate)){ return true; } } return false; } //合并$_POST 和 $_GET if(function_exists(array_merge)){ $ArrPostAndGet=array_merge($HTTP_POST_VARS,$HTTP_GET_VARS); }else{ foreach($HTTP_POST_VARS as $key=>$value){ $ArrPostAndGet[]=$value; } foreach($HTTP_GET_VARS as $key=>$value){ $ArrPostAndGet[]=$value; } } //验证开始 foreach($ArrPostAndGet as $key=>$value){ if (FunStringExist($value,$ArrFiltrate)){ echo "<script language=\\"javascript\\">alert(\\"Neeao提示,非法字符\\");</script>"; if (empty($StrGoUrl)){ echo "<script language=\\"javascript\\">history.go(-1);</script>"; }else{ echo "<script language=\\"javascript\\">window.location=\\"".$StrGoUrl."\\";</script>"; } exit; } } /*php 防注入函数
string  $feifa  限制元素组成
如有非法字符跳转到上一页 返回 0  没有返回 1
*/
//使用方法
$feifa=array("select","delete","from","update","create","destory","drop","alter","and","or","like","exec","count","*","chr","mid","master","truncate","char","declare",";","-","+");
$arrpostget=array("http://www.baidu.select cretecomdmin","wangw");
echo saftsql($feifa,$arrpostget);function saftsql($feifa,$arrpostget){
// $arrpostget=array_merge((array)$HTTP_PSOT_VARS,(array)$HTTP_GET_VARS);
  if($arrpostget){
         foreach($arrpostget as $key=>$value){
              for($i=0;$i<count($feifa);$i++){
                //找非法字符在$value中的位置
                $flag=strpos($value,$feifa[$i]);               
                if($flag)
                {                    
                 echo "<script type=\"text/javascript\">alert('URL有非法字符');</script>";
                 echo "<script type=\"text/javascript\">history.go(-1);</script>";
                 return 0;
                 exit;
                }else{
                    return 1;
                    }              }
         }
      return 1;  }$_POST = sql_injection($_POST);
$_GET = sql_injection($_GET);function sql_injection($content)
{
if (!get_magic_quotes_gpc()) {
if (is_array($content)) {
foreach ($content as $key=>$value) {
$content[$key] = addslashes($value);
}
} else {
addslashes($content);
}

return $content;
}   mysql_escape_string ('$user')谢谢

解决方案 »

  1.   

    php+mysql注入的防范方法。 
    在上一期的专题里已经讲了很多的防范方法,这里我就主要讲一下php+mysql注射攻击的防范方法。 
    大家看到,在magic_quotes_gpc=On的时候,很多的注射攻击已经没有作用了。 
    我们可以利用这个来加固我们的程序。Addslashes()函数等同于magic_quotes_gpc=On,而且与magic_quotes_gpc=On也不冲突,我们可以这样过滤 
    $username = addslashes($username); 
    $query="SELECT * FROM users WHERE userid='$username'"); 
    对于id型我们可以利用intval()函数,intval()函数可以将变量转换成整数类型,这样就可以了。 
    我们可以这样 
    $id = intval($id); 
    $query="SELECT * FROM alphadb WHERE articleid='$id'"); 
    如果是字符型的呢? 
    我们可以先用addslashes()过滤一下,然后再过滤"%"和"_". 
    例如: 
    $search = addslashes($search); 
    $search = str_replace("_","\_",$search); 
    $search = str_replace("%","\%",$search); 
    记得,可千万别在magic_quotes_gpc=On的情况下替换\为\\,如下: 
    $password=str_replace("\\","\\\\",$password); 
    我记得在darkness的文章《对某PHP站点的一次渗透》中提到过这个问题(在光盘中有收录)。 
    还有的就是登陆的地方,如果是只用一个管理员管理的话,我们可以直接对username和passwd用md5加密,这样就不用害怕注入技术的发展了。 
    Username=md5($HTTP_POST_VARS["username"]); 
    Passwd=md5($HTTP_POST_VARS["passwd"]); 
      

  2.   

    /*php 防注入函数
    string  $feifa  限制元素组成
    如有非法字符跳转到上一页 返回 0  没有返回 1
    */
    //使用方法
    $feifa=array("select","delete","from","update","create","destory","drop","alter","and","or","like","exec","count","*","chr","mid","master","truncate","char","declare",";","-","+");
    $arrpostget=array("http://www.baidu.select cretecomdmin","wangw");
    echo saftsql($feifa,$arrpostget);function saftsql($feifa,$arrpostget){
    // $arrpostget=array_merge((array)$HTTP_PSOT_VARS,(array)$HTTP_GET_VARS);
      if($arrpostget){
             foreach($arrpostget as $key=>$value){
                  for($i=0;$i<count($feifa);$i++){
                    //找非法字符在$value中的位置
                    $flag=strpos($value,$feifa[$i]);               
                    if($flag)
                    {                    
                     echo "<script type=\"text/javascript\">alert('URL有非法字符');</script>";
                     echo "<script type=\"text/javascript\">history.go(-1);</script>";
                     return 0;
                     exit;
                    }else{
                        return 1;
                        }              }
             }
          return 1;  }
    這個是防注入啊
    具體要了解清楚最好先知道是怎麼注入的,然後一看就比較明白了
      

  3.   

    // escaping some special chars to get rid of SQL enjection
    $string=mysql_real_escape_string($string);

    // get rid of some XSS script
    $string=strip_tags($string);
      

  4.   

    http://www.w3school.com.cn
    预防数据库攻击的正确做法:<?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);
    ?>
      

  5.   

    本文介绍的是用 mysql_real_escape_string对用户提交数据进行整理处理和通过addslashes以及mysql_escape_string这3个类似的功能函数的区别。经过转义的数据可以直接插入到数据库中。很好的说明了addslashes和mysql_real_escape_string的区别,虽然国内很多PHP coder仍在依靠addslashes防止SQL注入(包括我在内),我还是建议大家加强中文防止SQL注入的检查。addslashes的问题在于黑客可以用0xbf27来代替单引号,而addslashes只是将0xbf27修改为0xbf5c27,成为一个有效的多字节字符,其中的0xbf5c仍会被看作是单引号,所以addslashes无法成功拦截。当然addslashes也不是毫无用处,它是用于单字节字符串的处理,多字节字符还是用mysql_real_escape_string吧。另外对于php手册中get_magic_quotes_gpc的举例:
    if (!get_magic_quotes_gpc()) {
    $lastname = addslashes($_POST[‘lastname’]);
    } else {
    $lastname = $_POST[‘lastname’];
    }
    最好对magic_quotes_gpc已经开放的情况下,还是对$_POST[’lastname’]进行检查一下。再说下mysql_real_escape_string和mysql_escape_string这2个函数的区别:
    mysql_real_escape_string 必须在(PHP 4 >= 4.3.0, PHP 5)的情况下才能使用。否则只能用 mysql_escape_string ,两者的区别是:
    mysql_real_escape_string 考虑到连接的当前字符集,而mysql_escape_string 不考虑。
    总结一下:addslashes() 是强行加;mysql_real_escape_string()  会判断字符集,但是对PHP版本有要求;mysql_escape_string不考虑连接的当前字符集
      

  6.   

    自己的项目的话,直接用mysqli提供的prepare stament,别在这上面纠结了。
    否则的话mysql_real_escape_string比较好些。
      

  7.   

    同时可以借用preg_replace函数结合正则表达式来清除一些潜在的16进制字符串
      

  8.   

    <img src="http://www.tuipai.mobi/pics/201106101712281000.jpg">