14

我正在开发一个使用 Wordpress 作为 CMS 的应用程序。

我有一个包含很多输入字段的表单,在存储到数据库之前需要对其进行清理。
我想防止 SQL 注入、注入 javascript 和 PHP 代码以及其他有害代码。

目前我正在使用自己的方法来清理数据,但我觉得使用 WP 使用的功能可能会更好。

我已经查看了 Wordpress 中的数据验证,但我不确定我应该使用多少这些功能,以及以什么顺序使用。谁能告诉最好使用哪些 WP 功能?

目前,我正在通过执行以下操作“清理”我的输入:

  1. 因为带有重音符号(é、ô、æ、ø、å)的字符以一种有趣的方式存储在数据库中(即使我的表设置为ENGINE=InnoDB和) DEFAULT CHARSET=utf8COLLATE=utf8_danish_ci我现在正在使用 htmlentities 转换可以有重音符号的输入字段()。

  2. 创建用于输入数据的 SQL 字符串时,我使用mysql_real_escape_string().

我认为这不足以防止攻击。因此,非常感谢您提出改进建议。

4

1 回答 1

16

输入“消毒”是假的。

您不应该尝试通过过滤(*)或转义输入来保护自己免受注入困境,您应该使用原始字符串,直到您将它们放入另一个上下文中。此时,您需要该上下文的正确转义函数,mysql_real_escape_string用于 MySQL 查询和htmlspecialcharsHTML 输出。

(WordPress 添加了自己的转义函数,如esc_html,原则上没有什么不同。)

(*: 好吧,除了特定于应用程序的要求,例如检查电子邮件地址是否真的是电子邮件地址,确保密码合理等等。还有一个合理的论点是在输入时过滤掉控制字符阶段,尽管实际上很少这样做。)

我现在正在使用 htmlentities() 转换可以有重音符号的输入字段。

我强烈建议不要这样做。您的数据库应包含原始文本;如果将列编码为 HTML,则对列进行数据库操作会变得更加困难。您也在转义字符,例如<"ASCII 字符。当您从数据库中获取数据并将其用于其他原因而不是将其复制到页面中时,您现在在数据中得到了虚假的 HTML 转义。在您将文本写入页面的最后一刻之前,不要进行 HTML 转义。

如果您在将非 ASCII 字符输入数据库时​​遇到问题,那么您应该首先解决另一个问题,而不是采取不可持续的解决方法,例如存储 HTML 编码的数据。这里有很多关于让 PHP 和数据库使用正确的 UTF-8 的帖子,但主要是确保您的 HTML 输出页面本身使用Content-Typeheader/meta 正确地作为 UTF-8 提供。然后检查您的 MySQL 连接是否设置为 UTF-8,例如使用mysql_set_charset().

创建用于输入数据的 SQL 字符串时,我使用 mysql_real_escape_string()。

对,那是正确的。只要您这样做,您就不会受到 SQL 注入的攻击。如果您在数据库端而不是模板输出端进行 HTML 转义,则您可能容易受到 HTML 注入(导致 XSS)的攻击。因为任何未通过数据库的字符串例如,直接从 获取$_GET)都不会被 HTML 转义。

于 2010-01-24T13:26:12.350 回答