似乎开箱即用,没有区别
function esc_html( $text ) {
$safe_text = wp_check_invalid_utf8( $text );
$safe_text = _wp_specialchars( $safe_text, ENT_QUOTES );
/**
* Filters a string cleaned and escaped for output in HTML.
*
* Text passed to esc_html() is stripped of invalid or special characters
* before output.
*
* @since 2.8.0
*
* @param string $safe_text The text after it has been escaped.
* @param string $text The text prior to being escaped.
*/
return apply_filters( 'esc_html', $safe_text, $text );
}
function esc_attr( $text ) {
$safe_text = wp_check_invalid_utf8( $text );
$safe_text = _wp_specialchars( $safe_text, ENT_QUOTES );
/**
* Filters a string cleaned and escaped for output in an HTML attribute.
*
* Text passed to esc_attr() is stripped of invalid or special characters
* before output.
*
* @since 2.0.6
*
* @param string $safe_text The text after it has been escaped.
* @param string $text The text prior to being escaped.
*/
return apply_filters( 'attribute_escape', $safe_text, $text );
}
这两个功能之间的唯一区别是最后应用了过滤器。WordPress不会向这些过滤器添加任何内容,因此在标准WP安装中,它们是不可操作的。它们是在某些人可能需要它们的情况下提供的。
快速问答
所以默认情况下它们是相同的吗?
是! 在esc_attr
与esc_html
函数具有相同的实现
过滤器是否相同?
唯一的区别是它们具有不同的名称,它们以相同的方式工作,以相同的方式使用,并且在内核中均未使用任何过滤器。
过滤器有作用吗?
没有!在wp_check_invalid_utf8
和_wp_specialchars
调用时,所有转义都在函数中完成。
过滤器不会进行转义,它们是插件进行额外检查和处理的机会。
是否有边缘情况?
只有当你使用的过滤器,说你勾搭成esc_html
,但不是attribute_escape
,反之亦然。对于标准WP安装,这两个功能相同,没有区别。
为什么attribute_escape
不esc_attr
呢?
向后兼容。曾经有一个attribute_escape
函数,现在esc_
在添加样式函数后将其标记为已弃用。
为什么要使用这些过滤器?
¯\_(ツ)_/¯
这将是罕见的情况。某些人可能会以滥用翻译API来搜索替换文本的相同方式滥用它。这已经不是一个好习惯,因为这些滤波器被称为很多,很小的速度损失被放大了数千倍。
但是请考虑一下,如果您不小心,可能会通过撤消它们添加的转义或在末尾添加未转义的内容来损害这些功能的安全性。因此,过滤器很危险。
我需要为此担心吗?
不需要。您只需要担心是否使用了这些过滤器,这些过滤器本身就应该引发大量的红色警报,表明您的开发中出现了严重错误。
功能esc_attr
和esc_html
使用是安全的,并逃离内容。如果您重视代码的安全性,则您有道德和道德义务使用它们
这是否意味着我应该使用esc_html
?
不,逃避就是建立期望。如果您需要一个属性,请使用esc_attr
。仅仅因为目前功能相同,并不意味着将来不会因安全版本而改变