使用 Wordpress,有人可以告诉我清理输入的最佳方法吗?
Posted
技术标签:
【中文标题】使用 Wordpress,有人可以告诉我清理输入的最佳方法吗?【英文标题】:Using Wordpress, can some one tell me the best way of sanitizing input? 【发布时间】:2011-01-08 18:42:34 【问题描述】:我正在开发一个使用 Wordpress 作为 CMS 的应用程序。
我有一个包含很多输入字段的表单,在存储到数据库之前需要对其进行清理。 我想防止 SQL 注入、javascript 和 php 代码注入以及其他有害代码。
目前我正在使用自己的方法来清理数据,但我觉得使用 WP 使用的功能可能会更好。
我在 Wordpress 中查看了Data Validation,但我不确定我应该使用多少这些功能,以及以什么顺序使用。谁能告诉最好使用哪些 WP 功能?
目前我正在通过执行以下操作“清理”我的输入:
因为带有重音符号(é、ô、æ、ø、å)的字符以一种有趣的方式存储在数据库中(即使我的表设置为 ENGINE=InnoDB
、DEFAULT CHARSET=utf8
和 COLLATE=utf8_danish_ci
) ,我现在正在使用 htmlentities() 转换可以有重音符号的输入字段。
在创建输入数据的SQL字符串时,我使用mysql_real_escape_string()
。
我认为这不足以防止攻击。非常感谢您提出改进建议。
【问题讨论】:
【参考方案1】:输入的“消毒”是假的。
您不应该试图通过过滤(*)或转义输入来保护自己免受注入问题的影响,您应该使用原始字符串,直到您将它们放入另一个上下文中。此时,您需要该上下文的正确转义函数,对于 MySQL 查询是 mysql_real_escape_string
,对于 HTML 输出是 htmlspecialchars
。
(WordPress添加了自己的转义函数,如esc_html
,原则上没有什么不同。)
(*: 好吧,除了特定于应用程序的要求,例如检查电子邮件地址是否真的是电子邮件地址,确保密码合理等等。还有一个合理的论点可以过滤掉控制字符在输入阶段,尽管实际上很少这样做。)
我现在正在使用 htmlentities() 转换可以带有重音符号的输入字段。
我强烈建议不要这样做。您的数据库应包含原始文本;如果将列编码为 HTML,则对列进行数据库操作会变得更加困难。您也在同时转义 <
和 "
等非 ASCII 字符。当您从数据库中获取数据并将其用于其他原因而不是将其复制到页面中时,您现在在数据中得到了虚假的 HTML 转义。在您将文本写入页面的最后一刻之前,不要进行 HTML 转义。
如果您在将非 ASCII 字符输入数据库时遇到问题,那么您应该首先解决另一个问题,而不是采用不可持续的解决方法,例如存储 HTML 编码的数据。这里有很多关于让 PHP 和数据库使用正确的 UTF-8 的帖子,但主要是确保您的 HTML 输出页面本身使用Content-Type
header/meta 正确地作为 UTF-8 提供。然后检查您的 MySQL 连接是否设置为 UTF-8,例如使用 mysql_set_charset()
。
在创建 SQL 字符串来输入数据时,我使用了 mysql_real_escape_string()。
是的,没错。只要您这样做,您就不会受到 SQL 注入的攻击。如果您在数据库端而不是模板输出端进行 HTML 转义,您可能容易受到 HTML 注入(导致 XSS)的影响。因为任何没有通过数据库的字符串(例如,直接从$_GET
获取)都不会被HTML转义。
【讨论】:
在 WP 中进行 SQL 查询,你应该使用 $wpdb->prepare( ) 方法而不是使用 mysql_real_escape_string。如果您仍然想使用 WP API。以上是关于使用 Wordpress,有人可以告诉我清理输入的最佳方法吗?的主要内容,如果未能解决你的问题,请参考以下文章
关于 rake 资产的困惑:在 rails 中的资产管道上清理 / 清理