问题描述

我想确保我的插件/主题中的所有数据在进入数据库之前和输出到浏览器之前被安全地处理。我的问题是,在某些情况下,API 可以处理您的消毒,例如在保存后期元字段时,以及其他插件/主题作者完全负责的方式,例如保存自定义设置时。

对于这个问题的范围,我不关心在域级验证数据 – 例如,检查表单上的 Age 字段是在 0 到 120 之间,还是 e-mail 地址是有效的。我只关心安全性 – 例如,转义 SQL 查询以避免在保存到数据库时进行 SQL 注入,或者将输出到 HTML 模板的数据进行消毒以避免 XSS 。

对于输出消毒,我知道当将变量变回 HTML 模板时,您始终需要使用像 esc_html()esc_attr()这样的功能。但是,当使用 template tags 时呢?他们是否已经对产品进行了消毒?如果是,对于哪个上下文 (一般的 HTML,标签属性等)?某些功能具有不同上下文的变体 (例如 the_title_attribute(),但绝大多数情况) 。

对于输入消毒,我知道在进行手动查询时需要使用 $wpdb->prepare(),但是当使用 Settings API 创建插件设置页面或者为自定义帖子类型保存后期字段时呢?

现在我刚刚挖掘了 Core 和阅读教程,每次我使用一个函数来确定它是否消毒,但这是 error-prone 和耗时。我希望找到一些全面的可能情况列表,以及 API 是否处理它。例如。,

API 验证/消毒

  • 使用 update_postmeta()保存后期元

  • 使用 update_user_meta()保存用户元数据

  • 输出帖子标题 – 使用 the_title()的上下文相关变体

  • 等等

您必须手动验证/消毒

  • 使用 Settings API 保存插件选项。将回调作为 register_setting()的第 3 个参数。

  • 直接数据库查询:将查询包装在 $wpdb->prepare()中。

  • 在 HTML 中输出变量。使用 esc_attr()esc_html()

  • 等等

我也有兴趣了解 API 在某些情况下提供的原因,但不是其他的。我假设它与数据的未知性有关,但很乐意听到一个彻底的解释。

最佳解决方案

这里有两个概念:

  • 验证 – 确保数据有效,即整数为整数,日期为日期 (格式正确) 。这应该在保存数据之前完成。

  • 卫生 – 使日期安全在当前上下文中使用 (例如转义 SQL 查询或在输出中转义 HTML) 。

几乎普遍地,验证完全归功于你。你知道你正在向用户询问什么数据,并且知道你期望的数据 – WordPress 没有。将在 save_post 钩子上执行验证,然后将其保存到具有 update_post_meta 的数据库中,或者可以通过在设置 API 中指定回调函数来完成,即在 WordPress 保存数据之前调用。

三化有点混杂。当处理 WordPress 本身知道的数据 (例如一个帖子的图块) 时,您可以确保 WordPress 已经使数据安全。但是’safe’ 取决于上下文; 什么是安全的在页面上使用,不一定是安全的元素属性。因此,WordPress 将为不同的上下文 (例如 the_title()the_title_rss()the_title_attribute()) 具有不同的功能,因此您需要使用正确的功能。

在大多数情况下,您的 plug-in 可能会处理自定义表格中的后期元数据或事件数据。 WordPress 不知道这些数据是什么或是什么,所以它肯定不知道如何使其安全。这取决于你这对于使用 esc_url()esc_attr()esc_textarea()等来防止恶意输入能够嵌入代码尤其重要。由于 WordPress 知道 next_posts()是假设打印一个 url 到页面,它适用于 esc_url() – 但是使用后期元,说,它不知道它存储一个 url – 或者你想做什么 (如果打印,esc_url(),如果重定向 esc_url_raw()。如果在 dobut – 错误的一面谨慎,并自行逃脱 – 并尽可能晚地做到这一点。

最后 – 如何保存数据?你需要安全吗?如上所述,您需要确保数据有效。但是如果使用 WordPress API(wp_insert_post()update_post_meta()等),那么您不需要对数据进行清理 – 因为在保存数据时,您需要做的唯一的清理就是转义 SQL 语句 – 而 WordPress 也会这样做。如果您正在运行直接的 SQL 语句 (比如从定制表读取/写入数据),那么您应该使用 $wpdb 类来帮助您清理查询。

我写了这本 blog post on data sanitisation and validation,你可能会发现有用的 – 在这里我谈到你在这方面的预期。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。