最近,我在一些客户的网站上进行了审核。他们回来的一件事是我可以更好地消毒输入数据,因为人们仍然可能对数据库造成潜在的伤害。
以下功能是我目前正在使用的(旧开发者的剩余部分),但我看不出潜在问题可能存在的地方。
传递给数据库的字符串将通过XML显示,而XML又由Flash应用程序读取。
有谁能告诉我可能会缺少什么?感谢
function secure_string($string)
{
return (strip_tags(addslashes(mysql_real_escape_string(
stripslashes($string)))));
}
答案 0 :(得分:5)
看起来这个功能太多了。 mysql_real_escape_string()
已经逃脱了你需要逃脱的一切,所以不需要在那里运行addslashes()
。实际上,通过转义mysql_real_escape_string()
创建的反斜杠,它可能弊大于利。
答案 1 :(得分:5)
最好使用新的PHP函数filter_var()来清理输入。新的更好。
答案 2 :(得分:2)
mysql_real_escape_string
是最后一步,你不应该将它用作你的应用程序逻辑。它的唯一目的是将字符串传递给数据库,因此仅在构造查询时使用它。您可以将任何内容传递给mysql_real_escape_string
,它将确保您可以安全地将其存储在数据库中。
其余的,取决于你想要什么。如果要删除标记,请使用strip_tags
等
答案 3 :(得分:1)
取决于“安全”字符串的使用位置。如果要在数据库中使用它,则只需要mysql_real_escape_string()
,仅此而已。如果它将以html格式显示,则只需htmlentities()
,仅此而已。简而言之:您的代码执行过多,甚至可能有害。
如果要将其存储在数据库中以便在html中显示(例如注释),则在存储字符串时应使用mysql_real_escape_string()
,在显示字符串时使用htmlentities()
。
答案 4 :(得分:1)
如果您的服务器使用php 5.2或更高版本,则应使用filter_var作为XML部分。
$output = filter_var($input, FILTER_SANITIZE_STRING);
要将某些内容存储到数据库中,请使用PDO和参数化查询。
答案 5 :(得分:1)
尝试在输入时解决问题是一种误称,因为问题发生在输出时。请看我的回答: