我还应该做些什么来消毒用户输入?

时间:2009-10-29 09:58:34

标签: php mysql security

最近,我在一些客户的网站上进行了审核。他们回来的一件事是我可以更好地消毒输入数据,因为人们仍然可能对数据库造成潜在的伤害。

以下功能是我目前正在使用的(旧开发者的剩余部分),但我看不出潜在问题可能存在的地方。

传递给数据库的字符串将通过XML显示,而XML又由Flash应用程序读取。

有谁能告诉我可能会缺少什么?感谢

function secure_string($string)
{   
    return (strip_tags(addslashes(mysql_real_escape_string(
                      stripslashes($string)))));
}

6 个答案:

答案 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)

尝试在输入时解决问题是一种误称,因为问题发生在输出时。请看我的回答:

What’s the best method for sanitizing user input with PHP?