preg_replace导致字符编码错误

时间:2017-01-28 11:48:58

标签: php regex character-encoding preg-replace html-entities

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

形式: http://prntscr.com/e1eb17

数据库: http://prntscr.com/e1ebah

通过评论代码,我能够确定以下行导致错误:

$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;
}

我不是正则表达式专家 - 事实上,我从网站上获取了该正则表达式,所以我不知道发生了什么。你能救我吗?

0 个答案:

没有答案