这里有一些混淆,因为并非所有这些都是验证,还有另外两个是理解什么是适当的所必需的:
验证消毒
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
验证检查用户输入的电话号码是否确实是电话号码。这是一个true
或false
检查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属性,但如果是href
或src
属性,我们将使用esc_url
表明这是我们打算输出的URL。
关于双转义与wp_kses
可以多次清理和验证,但只应转义一次值。这是因为双重转义可以对值进行双重编码,并且在某些情况下可以允许内容脱离转义。
wp_kses_post
和wp_kses
也不寻常,因为它们可以用来逃跑,and 可以对一个值多次使用。
提前逃跑的注意事项这是一种近乎致命的罪恶,它几乎可以摧毁逃跑带给你的一切。一旦有东西逃走了,我们知道输出它是安全的,but, 如果我们把它赋给一个变量,谁知道在转义和输出之间会发生什么。如果该变量被修改、传递给函数或通过过滤器管道传输,它就不再安全,它的状态是个谜。我们可以再次逃逸,但现在我们已经双重逃逸,所以我们可能会使安全数据变得危险,或者损坏好的数据。
那么,关于这些过滤器,我们是否应该清理并验证apply_filters()
像下面的例子?
这取决于上下文
输入时:
清理,然后验证,如果有效,则继续,否则在输出到浏览器/请求/等时拒绝:
如果愿意,您可以对从数据库中提取的数据进行清理和验证,但#1的优先级是转义,只转义一次,并在输出时执行。不要将其存储在变量中,这是早期逃逸,也是危险的,在过滤后逃逸,而不是之前逃逸,谁知道过滤器对已知安全值做了什么,一旦值从过滤器返回,其安全性和状态就是个谜absint( apply_filters( \'slug_excerpt_length\', 35 ) );
很好,我们现在知道这个值肯定是一个数字,也是一个正数。如果我们在这个语句前面加上echo
那么这是一个安全的转义值。否则,只有消毒才能清除价值。
wp_kses_post( apply_filters( \'slug_excerpt_more\', \'…\' ) );
很好,如果我们立即输出它,这既是清理,也是转义,但如果我们将其保存到变量,这就是清理。esc_url( apply_filters( \'slug_login_url\', home_url( \'/\' ) ) );
这是正在逃跑,需要echo
陈述如果我们把它赋给一个变量,那么逃逸是徒劳的,我们引入了一个不稳定的情况。如果另一方面的问题是,我们是否应该仔细检查过滤器的返回值?是的,那是明智的,但要谨慎。在这种情况下,我希望这是对未正确实现的过滤器进行测试,例如,返回预期数字的文本。在这种情况下,验证是唯一的选择,转义和消毒是不合适的。
使用时的例外情况the_content
筛选,传递值wp_kses_post
然后将其送入滤波器并立即回波,例如。echo apply_filters( \'the_content\', wp_kses_post( $dangerous ) );