2011-05-11 31 views
0

我通常通过以下操作逃跑用户输入:PHP:建议就如何用户输入“免疫”

htmlspecialchars($str,ENT_QUOTES,"UTF-8");

以及mysql_real_escape_string($str)每当一个MySQL连接可用。

这怎么能改进?到目前为止,我还没有遇到任何问题,但我对此不确定。

谢谢。

+1

用户输入只有在*使用*时才需要转义,然后只能用于确切使用所需的卫生方法。相关或伪装:[PHP的:最终清洁/安全功能](http://stackoverflow.com/q/4223980) – 2011-05-11 12:45:11

+0

我会给这个阅读。谢谢。 – Francisc 2011-05-12 09:54:37

回答

2

数据应转义(消毒)进行存储和编码以用于显示。数据应该从未被编码存储。您只想存储原始数据。请注意,转义并不会改变原始数据,因为转义字符没有存储;它们仅用于正确指示原始数据和命令语法之间的差异。

总之,要做到以下几点:

$data = $_POST['raw data']; 
//Shorthand used; you all know what a query looks like. 
mysql_query("INSERT " . mysql_real_escape_string($data)); 

$show = mysql_query("SELECT ..."); 
echo htmlentities($show); 
// Note that htmlentities() is usually overzealous. 
// htmlspecialchars() is enough the majority of the time. 
// You also don't have to use ENT_QUOTES unless you are using single 
// quotes to delimit input (or someone please correct me on this). 

您可能还需要如果启用魔术引号剥离从用户输入斜线。 stripslashes()就够了。

至于为什么你不应该编码存储,看看下面的例子:

说,你有一个数据库字段是char(5)。 html输入也是maxlength="5"。如果用户输入“& & & & &”,这可能是完全有效的,则将其存储为“& &”。当它被检索并显示回给用户时,如果你不编码,他们将看到“& &”,这是不正确的。如果你编码,他们看到“& amp; &”,这也是不正确的。您不存储用户打算存储的数据。您需要存储原始数据。

在用户想要存储特殊字符的情况下,这也成为问题。你如何处理这些存储?你没有。将其存储为原始。

为了抵御sql注入,至少在转义输入mysql_real_escape_string,但建议使用准备好的语句与像PDO的数据包封装。找出哪一个最好,或者自己写(并且彻底测试)。

为了防御XSS(跨站点脚本),在将用户输入显示回给用户输入之前对其进行编码。

+0

谢谢,tandu。 – Francisc 2011-05-12 09:42:39

+0

很好解释! – Tech4Wilco 2011-10-17 19:25:07

1

如果您只使用mysql_real_escape_string($str)来避免sql注入,请确保您总是在您的查询中添加单引号。

将不安全的输出解析到屏幕时,htmlspecialchars很好。

+0

谢谢,韦斯利。 – Francisc 2011-05-12 09:54:20