我想确保插件/主题中的所有数据在进入数据库之前以及输出到浏览器之前都得到安全处理。我的问题是,在某些情况下,API会为您处理清理操作(例如,保存帖子元字段时),而在某些情况下,插件/主题作者将全权负责清理操作(例如,保存自定义设置时)。
对于此问题的范围,我不关心在域级别验证数据-例如,检查表单上的Age字段是否在0到120之间,或电子邮件地址是否有效。我只关心安全性-例如,转义SQL查询以避免在保存到数据库时进行SQL注入,或者清除输出到HTML模板的数据以避免XSS。
为了进行输出清理,我知道在将变量回显到HTML模板中时,您总是需要使用esc_html()
和之类的函数esc_attr()
。但是,使用模板标签时呢?他们都已经清理输出了吗?如果是这样,则针对哪个上下文(常规HTML,标记属性等)?某些函数具有针对不同上下文的变体(例如the_title_attribute()
,但大多数没有)。
为了进行输入清理,我知道$wpdb->prepare()
在进行手动查询时需要使用,但是在使用Settings API创建插件设置页面或为自定义帖子类型保存帖子元字段时该怎么办?
现在,每当我使用一个函数来查找它是否可以清除时,我就一直在深入研究Core并阅读教程,但这很容易出错并且很耗时。我希望找到所有可能情况以及API是否处理的全面列表。例如,
API验证/清除
- 使用
update_postmeta()
- 保存用户元
update_user_meta()
- 输出帖子标题-使用上下文相关的变体
the_title()
- 等等
您必须手动验证/消毒
- 使用Settings API保存插件选项。将回调作为的第3个参数传递
register_setting()
。 - 直接数据库查询:将查询包装在中
$wpdb->prepare()
。 - 以HTML输出变量。使用
esc_attr()
,esc_html()
等 - 等等
我也很想了解为什么在某些情况下API提供了它,而在其他情况下却没有。我假设它与数据的未知性质有关,但希望听到一个详尽的解释。
the_title()
,the_permalink()
等),你是罚款,但与自定义数据你是不是(例如get_post_meta()
)。如有疑问,请对自己的身体进行消毒 -不会受伤。