我正在使用一个函数来避免在我的表单中注入sql。到目前为止,它工作正常,直到我注意到,在提交字段时,某些字符被html实体替换并以这种方式显示
数据库: 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;
}
我不是正则表达式专家 - 事实上,我从网站上获取了该正则表达式,所以我不知道发生了什么。你能救我吗?