PHP开发中常见的安全问题详解和解决方法(如S(5)

$id = addslashes($_POST['id']); //正确是$id = intval($_POST['id']); 
$sql =" select * from phpben.com where id =$id"; 
$sql =" select * from phpben.com where id =1 or 1=1";


对比容易发现,post过来的数据通过addslashes过滤后的确很多注入已经不起作用,但是$id并没有intval,导致漏洞的存在,这是个小细节,不小心则导致漏洞。

(2)对于非文本参数的过滤

文本参数是指标题、留言、内容等可能有“'”,“'”等内容,过滤时不可能全部转义或代替。

但非文本数据可以。

复制代码 代码如下:


function _str_replace($str ) 

     $str = str_replace(" ","",$str); 
     $str = str_replace("\n","",$str); 
     $str = str_replace("\r","",$str); 
     $str = str_replace("'","",$str); 
     $str = str_replace('"',"",$str); 
     $str = str_replace("or","",$str); 
     $str = str_replace("and","",$str); 
     $str = str_replace("#","",$str); 
     $str = str_replace("\\","",$str); 
     $str = str_replace("-- ","",$str); 
     $str = str_replace("null","",$str); 
     $str = str_replace("%","",$str); 
     //$str = str_replace("_","",$str); 
     $str = str_replace(">","",$str); 
     $str = str_replace("<","",$str); 
     $str = str_replace("=","",$str); 
     $str = str_replace("char","",$str); 
     $str = str_replace("declare","",$str); 
     $str = str_replace("select","",$str); 
     $str = str_replace("create","",$str); 
     $str = str_replace("delete","",$str); 
     $str = str_replace("insert","",$str); 
     $str = str_replace("execute","",$str); 
     $str = str_replace("update","",$str); 
     $str = str_replace("count","",$str); 
     return $str; 
}

ps:还有一些从列表页操作过来的一般href是”phpben.php?action=delete&id=1”,这时候就注意啦,_str_replace($_GET['action'])会把参数过滤掉,笔者一般不用敏感关键作为参数,比如delete会写成del,update写成edite,只要不影响可读性即可;

还有上面代码过滤下划线的笔者注悉掉了,因为有些参数可以使用下划线,自己权衡怎么过滤;

有些代码把关键字当重点过滤对象,其实关键字的str_replace很容易“蒙过关”,str_replace(“ininsertsert”)过滤后的字符还是insert,所以关键的是其他字符而不是mysql关键字。

(3)文本数据防注入代码。

文本参数是指标题、留言、内容等这些数据不可能也用str_replace()过滤掉,这样就导致数据的完整性,这是很不可取的。

代码:

复制代码 代码如下:


function no_inject($str) 


         if(is_array($str)) 
         { 
                   foreach($str as $key =>$val) 
                   { 
                           $str[$key]=no_inject($val); 
                   } 
         }else 
         { 
                   $str = str_replace(" "," ",$str); 
                   $str = str_replace("\\","\",$str); 
                   $str = str_replace("'","'",$str); 
                   $str = str_replace('"',""",$str); 
                   $str = str_replace("or","or",$str); 
                   $str = str_replace("and","and",$str); 
                   $str = str_replace("#","#",$str); 
                   $str = str_replace("-- ","-- ",$str); 
                   $str = str_replace("null","null",$str); 
                   $str = str_replace("%","%",$str); 
                   //$str = str_replace("_","",$str); 
                   $str = str_replace(">",">",$str); 
                   $str = str_replace("<","<",$str); 
                   $str = str_replace("=","=",$str); 
                   $str = str_replace("char","char",$str);   
                   $str = str_replace("declare","declare",$str); 
                   $str = str_replace("select","select",$str); 
                  $str = str_replace("create","create",$str); 
                  $str = str_replace("delete","delete",$str); 
                  $str = str_replace("insert","insert",$str); 
                 $str = str_replace("execute","execute",$str); 
                 $str = str_replace("update","update",$str); 
                 $str = str_replace("count","count",$str); 
         } 
    return $str; 
}



(4)当然还有其他与addslashes、mysql_escape_string结合的代码。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/9b60f9a26cc0359ef55395098f85bfd1.html