我通常通过执行以下操作来逃避用户输入:
htmlspecialchars($str,ENT_QUOTES,"UTF-8");
以及mysql_real_escape_string($str)
只要有 mysql 连接可用。
如何改进?到目前为止,我对此没有任何问题,但我不确定。
谢谢你。
我通常通过执行以下操作来逃避用户输入:
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"
. 如果用户输入可能完全有效的“&&&&&”,则将其存储为“&&”。当它被检索并显示给用户时,如果你不编码,他们会看到“&&”,这是不正确的。如果您进行编码,他们会看到“&&”,这也是不正确的。您没有存储用户打算存储的数据。您需要存储原始数据。
这在用户想要存储特殊字符的情况下也成为问题。您如何处理这些存储?你没有。把它生吃。
为了防止 sql 注入,至少使用 转义输入mysql_real_escape_string
,但建议使用带有数据库包装器(如 PDO)的准备好的语句。找出哪一个效果最好,或者自己编写(并彻底测试)。
为了防御 XSS(跨站点脚本),在用户输入显示给他们之前对其进行编码。
如果您只用于mysql_real_escape_string($str)
避免 sql 注入,请确保始终在查询中添加单引号。
将不安全的输出解析到屏幕时,htmlspecialchars 很好。
对于数据库切换到 PDO。这要容易得多,并且可以为您逃脱。