0

我通常通过执行以下操作来逃避用户输入:

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

以及mysql_real_escape_string($str)只要有 mysql 连接可用。

如何改进?到目前为止,我对此没有任何问题,但我不确定。

谢谢你。

4

3 回答 3

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". 如果用户输入可能完全有效的“&&&&&”,则将其存储为“&&”。当它被检索并显示给用户时,如果你不编码,他们会看到“&&”,这是不正确的。如果您进行编码,他们会看到“&&”,这也是不正确的。您没有存储用户打算存储的数据。您需要存储原始数据。

这在用户想要存储特殊字符的情况下也成为问题。您如何处理这些存储?你没有。把它生吃。

为了防止 sql 注入,至少使用 转义输入mysql_real_escape_string,但建议使用带有数据库包装器(如 PDO)的准备好的语句。找出哪一个效果最好,或者自己编写(并彻底测试)。

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

于 2011-05-11T14:25:06.767 回答
1

如果您只用于mysql_real_escape_string($str)避免 sql 注入,请确保始终在查询中添加单引号。

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

于 2011-05-11T12:46:34.910 回答
1

对于数据库切换到 PDO。这要容易得多,并且可以为您逃脱。

http://php.net/pdo

于 2011-05-11T12:47:43.477 回答