Php 我还应该做什么来清理用户输入?
最近,我的一个客户对我的一些网站进行了审计。他们带来的一件事是,我可以更好地清理输入数据,因为人们仍然可能对数据库造成潜在危害 下面的函数是我目前正在使用的(老开发人员遗留下来的),但我看不出潜在的问题在哪里 传递到数据库的字符串将通过XML显示,而XML又由Flash应用程序读取 谁能告诉我我可能遗漏了什么?谢谢Php 我还应该做什么来清理用户输入?,php,mysql,security,Php,Mysql,Security,最近,我的一个客户对我的一些网站进行了审计。他们带来的一件事是,我可以更好地清理输入数据,因为人们仍然可能对数据库造成潜在危害 下面的函数是我目前正在使用的(老开发人员遗留下来的),但我看不出潜在的问题在哪里 传递到数据库的字符串将通过XML显示,而XML又由Flash应用程序读取 谁能告诉我我可能遗漏了什么?谢谢 function secure_string($string) { return (strip_tags(addslashes(mysql_real_escape_st
function secure_string($string)
{
return (strip_tags(addslashes(mysql_real_escape_string(
stripslashes($string)))));
}
看起来在这个函数中发生了太多的事情
mysql\u real\u escape\u string()
已经转义了您需要转义的所有内容,因此无需对其运行addslashes()
。事实上,它可以通过逃逸反斜杠mysql\u real\u escape\u string()
创建的字符串来弊大于利。取决于“安全”字符串的使用位置。如果要在数据库中使用它,您只需要mysql\u real\u escape\u string()
,就可以了。如果要以html格式显示,您只需要,仅此而已。简而言之:你的代码做得太多了,甚至可能是有害的
如果要将其存储在数据库中,以便以后以html格式显示(例如,如注释),则在存储字符串时应使用
mysql\u real\u escape\u string()
,在显示字符串时应使用htmlentities()
。mysql\u real\u escape\u string
是最后一步,您不应该在应用程序逻辑中使用它。它的唯一用途是将字符串传递给数据库,因此仅在构造查询时使用它。您可以将任何内容传递给mysql\u real\u escape\u string
,它将确保您可以安全地将其存储在数据库中
至于其余的,这取决于你想要什么。如果要去除标签,请使用
去除标签
,等等。最好使用新的PHP函数来清除输入。新的和更好的。如果您的服务器使用PHP5.2或更高版本,您应该将其用于XML部分
$output = filter_var($input, FILTER_SANITIZE_STRING);
若要将某些内容存储到数据库中,请使用和参数化查询。在输入时尝试解决问题是一种用词不当的做法,因为问题发生在输出时。在这里看到我的答案:
显示您需要该字符串的用途,而不是当前函数。保护取决于您想要防范的内容。@scragar,MySQL注入。至少他说客户说:“对数据库的潜在危害”。我不再做php了,但是,老实说,在一个链中调用
addslashes
和stripslashes
肯定会让我大吃一惊。字符串被输出到一个xml文件,然后由flash应用程序读取。感谢如果要将其添加到XML文件中,则在将其添加到XML文件时应将其转义为XML。在这里,您要处理的是将字符串添加到数据库中,因此要将其转义到数据库中。您需要为不同的目的使用不同的验证/转义函数。谢谢!当我抽离时,我不必担心精神是否健全!:)提示一下,有一个类似mysql\u real\u escape\u string()的函数,但用于postgresql?pg_escape_string或pg_escape_bytea似乎对注入不起作用pg_escape_string
怎么不起作用?它应该很好用pg_query_params
是运行查询的更好方法。