PHP:关于如何"immunized"用户输入的建议



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

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

以及每当MySQL连接可用时mysql_real_escape_string($str)

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

谢谢。

数据应转义(清理)以进行存储,并编码以进行显示。 切勿对数据进行编码以进行存储。 您只想存储原始数据。 请注意,转义根本不会更改原始数据,因为不会存储转义字符;它们仅用于正确指示原始数据和命令语法之间的差异。

简而言之,您要执行以下操作:

$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。这要容易得多,并且可以为您逃脱。

http://php.net/pdo

相关内容

  • 没有找到相关文章

最新更新