使用Apply_Filters()函数清理和数据验证

时间:2018-07-22 作者:Asaf

我们是否应该清理和验证apply_filters() 像下面的例子?

  1. absint( apply_filters( \'slug_excerpt_length\', 35 ) );

  2. wp_kses_post( apply_filters( \'slug_excerpt_more\', \'…\' ) );

  3. esc_url( apply_filters( \'slug_login_url\', home_url( \'/\' ) ) );

    我想知道你是怎么想的。

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

这里有一些混淆,因为并非所有这些都是验证,还有另外两个是理解什么是适当的所必需的:

验证消毒

Sanitisation makes things clean and well formed

这会清理数据,例如,修剪尾随空格,删除数字字段中的字母,使所有小写字段都是小写的,等等

E、 g.用户输入" Banana ", 所以把它变成"Banana"

消毒是应该发生的第一件事input 来自其他地方的数据,例如,在处理表单时,请在对其进行任何操作之前对数据进行清理。来自远程连接等的任何数据相同

常用的消毒方法包括:

通过剥离HTML或特定标记wp_kses wp_strip_all_tags etc

  • 删除字符范围,如非数字字符,或标点符号
  • 修剪尾随字符,如空格等
  • 应用边界,如将值限制在范围内(这可以作为验证检查来实现)
    • 验证

      Validation checks if things are valid

      验证检查用户输入的电话号码是否确实是电话号码。这是一个truefalse 检查

      E、 g.用户选择的水果实际上是水果吗?

      应在上完成此操作input 消毒后,如果验证失败,则中止,常用的验证方法包括:

      功能如下is_numeric etc正则表达式,适用于电话号码或URL之类的内容,具有预期格式的内容检查角色和功能,以验证用户是否有能力执行预期操作,例如,没有人有200个字符长的电话号码,也不会有人住在门牌号-2000000

    逃逸

    Escaping makes values safe for output, and enforces assumptions

    逃之夭夭,逃之夭夭。

    逃逸并没有被谈论太多,但想象一下它使用上面的水果示例。逃跑就像一条带着水果形状切口的传送带。你总是在最后得到水果形状的东西。如果一个水果穿过,它就没有被碰过,但是如果一个恶意的演员穿过,一个破损但安全的水果形状的版本就会在末端弹出。

    因此,逃避就是强化假设。E、 g.在<a> 标签href 属性应包含URL。但情况可能并非如此,转义允许我们将“应包含”替换为“将始终包含”,从而为我们提供了保证。这会阻止某人使用"/> 并插入任意HTML。

    应始终在output, 在可能的最新点上,确保没有任何修改。转义也是上下文相关的。您将使用esc_attr 转义HTML属性,但如果是hrefsrc 属性,我们将使用esc_url 表明这是我们打算输出的URL。

    关于双转义与wp_kses

    可以多次清理和验证,但只应转义一次值。这是因为双重转义可以对值进行双重编码,并且在某些情况下可以允许内容脱离转义。

    wp_kses_postwp_kses 也不寻常,因为它们可以用来逃跑,and 可以对一个值多次使用。

    提前逃跑的注意事项这是一种近乎致命的罪恶,它几乎可以摧毁逃跑带给你的一切。一旦有东西逃走了,我们知道输出它是安全的,but, 如果我们把它赋给一个变量,谁知道在转义和输出之间会发生什么。如果该变量被修改、传递给函数或通过过滤器管道传输,它就不再安全,它的状态是个谜。我们可以再次逃逸,但现在我们已经双重逃逸,所以我们可能会使安全数据变得危险,或者损坏好的数据。

    那么,关于这些过滤器,我们是否应该清理并验证apply_filters() 像下面的例子?

    这取决于上下文

    输入时:

    清理,然后验证,如果有效,则继续,否则在输出到浏览器/请求/等时拒绝:

    如果愿意,您可以对从数据库中提取的数据进行清理和验证,但#1的优先级是转义,只转义一次,并在输出时执行。不要将其存储在变量中,这是早期逃逸,也是危险的,在过滤后逃逸,而不是之前逃逸,谁知道过滤器对已知安全值做了什么,一旦值从过滤器返回,其安全性和状态就是个谜absint( apply_filters( \'slug_excerpt_length\', 35 ) );echo 那么这是一个安全的转义值。否则,只有消毒才能清除价值。

    1. wp_kses_post( apply_filters( \'slug_excerpt_more\', \'&hellip;\' ) );

      1. esc_url( apply_filters( \'slug_login_url\', home_url( \'/\' ) ) );
      这是正在逃跑,需要echo 陈述如果我们把它赋给一个变量,那么逃逸是徒劳的,我们引入了一个不稳定的情况。

      如果另一方面的问题是,我们是否应该仔细检查过滤器的返回值?是的,那是明智的,但要谨慎。在这种情况下,我希望这是对未正确实现的过滤器进行测试,例如,返回预期数字的文本。在这种情况下,验证是唯一的选择,转义和消毒是不合适的。

      使用时的例外情况the_content 筛选,传递值wp_kses_post 然后将其送入滤波器并立即回波,例如。echo apply_filters( \'the_content\', wp_kses_post( $dangerous ) );

    结束

    相关推荐

    Server side validation

    我正在尝试对post字段(自定义和/或非自定义字段)进行服务器端验证。验证工作正常,但如果验证失败,我似乎无法阻止帖子保存。我试过像这样的钩子save_post, publish_post, wp_insert_post_data, 等等。所有这些钩子都被调用了,但除非我使用wp_die(). 要明确的是,我不想改变职位状态;我只想返回到帖子页面(未保存),并在字段验证失败时显示一条消息。我认为这是非常基本的东西,但无论我做什么,这篇文章都会被保存下来。UPDATE:好的,那么pre_post_updat