Php preg_replace导致字符编码错误

Php preg_replace导致字符编码错误,php,regex,character-encoding,preg-replace,html-entities,Php,Regex,Character Encoding,Preg Replace,Html Entities,我使用一个函数来避免表单中的sql注入。到目前为止,它工作得很好,直到我注意到,在提交字段时,一些字符被html实体替换并以这种方式显示 表格: 数据库: 通过对代码进行注释,我能够确定以下行是导致错误的原因: $sql=preg_replace("/(from|select|insert|drop|table|delete|show tables|where|alter table|add|update|#|\*|--|=|xp_|NULL|KEY|\\\\)/","",$sql); 拆

我使用一个函数来避免表单中的sql注入。到目前为止,它工作得很好,直到我注意到,在提交字段时,一些字符被html实体替换并以这种方式显示

表格:

数据库:

通过对代码进行注释,我能够确定以下行是导致错误的原因:

$sql=preg_replace("/(from|select|insert|drop|table|delete|show tables|where|alter table|add|update|#|\*|--|=|xp_|NULL|KEY|\\\\)/","",$sql);
拆下这条线后,工作正常

完整查看防喷射功能:

function kill_injection($sql)
{
    if(is_array($sql))
    {
        for($i=0; $i<count($sql); $i++)
        {   
            $sql[$i]=preg_replace("/(from|select|insert|drop|table|delete|show tables|where|alter table|add|update|#|\*|--|=|xp_|NULL|KEY|\\\\)/","",$sql[$i]);

            if(is_string($sql[$i]))
            {
                $sql[$i]=str_replace("\r\n", " ", $sql[$i]);
                $sql[$i]=str_replace("\n", " ", $sql[$i]);
                $sql[$i]=str_replace("\r", " ", $sql[$i]);              
                $sql[$i]=trim($sql[$i]);    
                $sql[$i]=strip_tags($sql[$i]);  
                $sql[$i]=mysqli_real_escape_string(mysqli_connect("localhost", "root", "", "database"), $sql[$i]);
                $sql[$i]=addslashes($sql[$i]);
                $sql[$i]=preg_replace('/(\s)+/', ' ', $sql[$i]);
            }           
        }
    }
    else
    {       
        $sql=preg_replace("/(from|select|insert|drop|table|delete|show tables|where|alter table|add|update|#|\*|--|=|xp_|NULL|KEY|\\\\)/","",$sql);

        if(is_string($sql))
        {
            $sql=str_replace("\r\n", " ", $sql);
            $sql=str_replace("\n", " ", $sql);
            $sql=str_replace("\r", " ", $sql);  
            $sql=trim($sql);    
            $sql=strip_tags($sql);
            $sql=mysqli_real_escape_string(mysqli_connect("localhost", "root", "", "database"), $sql);  
            $sql=addslashes($sql);
            $sql=preg_replace('/(\s)+/', ' ', $sql);
        }
    }
    return $sql;
}
函数kill\u注入($sql)
{
if(is_数组($sql))
{

对于($i=0;$i当您可以使用参数并通过注入来完成时,您为什么需要执行所有这些操作?参数?请更具体一点。我还是信息安全方面的初学者。例如,请参阅。总是有现成的方法来处理事情,这样您就不必自己或在使用mysqli规范时进行可能损坏的实现@SamiKuhmonen说:“我当然会使用过程式PHP,但不确定它是否适用。”