插件在哪些环境中负责数据验证/清理?

时间:2012-09-06 作者:Ian Dunn

我想确保插件/主题中的所有数据在进入数据库和输出到浏览器之前都得到了安全处理。我的问题是,有些情况下,API会为您处理清理,比如在保存post meta字段时,还有一些情况下,插件/主题作者会全权负责,比如在保存自定义设置时。

对于这个问题的范围,我不关心在域级别验证数据,例如,检查表单上的年龄字段是否在0到120之间,或者电子邮件地址是否有效。我只关心安全性——例如,在保存到数据库时,转义SQL查询以避免SQL注入,或者清理输出到HTML模板的数据以避免XSS。

对于输出清理,我知道您始终需要使用以下函数esc_html()esc_attr() 将变量回送到HTML模板时。但是,当使用template tags? 他们是否都已经清理了输出?如果是,针对哪个上下文(通用HTML、标记属性等)?有些函数具有不同上下文的变体(如the_title_attribute(), 但大多数人没有。

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

现在,每次我使用一个函数来找出它是否会净化,我只是在深入研究核心并阅读教程,但这很容易出错,也很耗时。我希望找到一个全面的列表,列出所有可能的情况,以及API是否能处理这些情况。e、 g。,

API验证/清理保存post meta的update_postmeta()
  • 使用保存用户元update_user_meta()the_title()
    • 您必须使用设置API手动验证/清理保存插件选项。将回调作为的第三个参数传递register_setting().$wpdb->prepare().esc_attr(), esc_html(), 我还想了解为什么API在某些情况下提供它,而在其他情况下不提供它。我假设这与数据的未知性质有关,但我希望听到一个彻底的解释。

    2 个回复
    SO网友:Stephen Harris

    这里有两个概念:

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

  • 清除-使日期在当前上下文中使用时更加安全(例如,转义SQL查询,或在输出时转义HTML)solely down to you. 您知道您向用户询问的数据是什么,并且您知道您期望的数据是什么,而WordPress不知道。验证将在上执行,例如save_post 在将其保存到数据库之前使用update_post_meta, 也可以通过在设置API中指定回调函数来完成,该函数在WordPress保存数据之前调用。

    消毒有点复杂。当处理WordPress本机知道的数据(例如帖子的互动程序)时,您可以确保WordPress已经使数据安全。然而,“安全”取决于上下文;在页面上使用安全的内容不一定作为元素属性安全。因此,WordPress将针对不同的上下文具有不同的功能(例如the_title(), the_title_rss(), the_title_attribute()) - so you need to use the right one.

    在大多数情况下,您的插件可能会处理来自自定义表的后期元数据或事件数据。WordPress不知道这些数据是什么,也不知道它们的用途,所以它当然不知道如何确保其安全。This is up to you. 这在使用esc_url(), esc_attr(), esc_textarea() 防止恶意输入能够嵌入代码。因为WordPress知道next_posts() 如果要将url打印到页面,则应用esc_url() - 但是对于post meta,比如说,它不知道它存储了url,也不知道你想用它做什么(如果打印,esc_url(), 如果重定向esc_url_raw(). If in dobut - err on the side of caution and escape it yourself - 并尽可能晚地完成这项工作。

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

    这是我写的blog post on data sanitisation and validation 你可能会觉得这很有帮助,我在书中谈到了在这方面对你的期望。

  • SO网友:Ciprian

    不确定是否有那么彻底,但对于任何插件或主题,都应该清理用户输入。数据库操作应使用$wpdb->方法完成。应清理所有$\\u GET和$\\u POST数据。

    这比WordPress更适合PHP编程。

    总之,如果有WordPress函数,请使用它,如果没有,请自己清理变量和输入。

    如果我太含糊了,请问一个更具体的问题。

    结束

    相关推荐

    Comment form validation

    如何设置注释字段的验证规则?我更改了评论者姓名/电子邮件/主页onmouseover和onblur的值(我使用它而不是标签-因此如果字段为空,它会显示“您的电子邮件”、“您的主页”等)。问题是,在提交时,它会在主页字段中提交此文本(因为它没有验证,而不像电子邮件字段,如果您输入了除[email protected]).如何验证主页字段?