我通常通过以下操作逃跑用户输入:PHP:建议就如何用户输入“免疫”
htmlspecialchars($str,ENT_QUOTES,"UTF-8");
以及mysql_real_escape_string($str)
每当一个MySQL连接可用。
这怎么能改进?到目前为止,我还没有遇到任何问题,但我对此不确定。
谢谢。
我通常通过以下操作逃跑用户输入:PHP:建议就如何用户输入“免疫”
htmlspecialchars($str,ENT_QUOTES,"UTF-8");
以及mysql_real_escape_string($str)
每当一个MySQL连接可用。
这怎么能改进?到目前为止,我还没有遇到任何问题,但我对此不确定。
谢谢。
数据应转义(消毒)进行存储和编码以用于显示。数据应该从未被编码存储。您只想存储原始数据。请注意,转义并不会改变原始数据,因为转义字符没有存储;它们仅用于正确指示原始数据和命令语法之间的差异。
总之,要做到以下几点:
$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(跨站点脚本),在将用户输入显示回给用户输入之前对其进行编码。
谢谢,tandu。 – Francisc 2011-05-12 09:42:39
很好解释! – Tech4Wilco 2011-10-17 19:25:07
如果您只使用mysql_real_escape_string($str)
来避免sql注入,请确保您总是在您的查询中添加单引号。
将不安全的输出解析到屏幕时,htmlspecialchars很好。
谢谢,韦斯利。 – Francisc 2011-05-12 09:54:20
用户输入只有在*使用*时才需要转义,然后只能用于确切使用所需的卫生方法。相关或伪装:[PHP的:最终清洁/安全功能](http://stackoverflow.com/q/4223980) – 2011-05-11 12:45:11
我会给这个阅读。谢谢。 – Francisc 2011-05-12 09:54:37