esc_html过滤器和attribute_escape过滤器有什么区别?


8

esc_htmlattribute_escape过滤器的确切区别是什么?

esc_html()使用esc_html filteresc_attr()使用attribute_escape filter。两者都编码<>&“'(小于,大于,与号,双引号,单引号)。

我很想知道是什么使它们在安全性(转义)方面与众不同


好吧,如果它们没什么不同,就没有必要让它们两个.... IMO问题只是不清楚,就像问the_content和the_excerpt过滤器有什么区别
Mark Kaplun

1
我想这就是他要问的,它们有什么不同,为什么?
汤姆·J·诺威尔

@TomJNowell,其中一个被调用以转义属性,另一个被转义为通用HTML。这就解释了为什么,并且主要解释了为什么;)答案应该从这里开始,解释属性中允许的字符与一般html之间的区别?这听起来有点太基础了(但我猜想这可能是OP提出的问题)
Mark Kaplun

2
那会很好,但是举个例子,esc_attresc_html就是没有用的转义,毕竟为什么不esc_html到处使用呢?如果对您来说显而易见,那么这似乎不是一个很好的问题,但对于问问者来说,这两个函数如何不同(鉴于它们都逃脱了预期的字符),这并不明显
Tom J Nowell

Answers:


8

似乎开箱即用,没有区别

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_attresc_html函数具有相同的实现

过滤器是否相同?

唯一的区别是它们具有不同的名称,它们以相同的方式工作,以相同的方式使用,并且在内核中均未使用任何过滤器。

过滤器有作用吗?

没有!在wp_check_invalid_utf8_wp_specialchars调用时,所有转义都在函数中完成。

过滤器不会进行转义,它们是插件进行额外检查和处理的机会。

是否有边缘情况?

只有当你使用的过滤器,说你勾搭成esc_html,但不是attribute_escape,反之亦然。对于标准WP安装,这两个功能相同,没有区别。

为什么attribute_escapeesc_attr呢?

向后兼容。曾经有一个attribute_escape函数,现在esc_在添加样式函数后将其标记为已弃用。

为什么要使用这些过滤器?

¯\_(ツ)_/¯这将是罕见的情况。某些人可能会以滥用翻译API来搜索替换文本的相同方式滥用它。这已经不是一个好习惯,因为这些滤波器被称为很多,很小的速度损失被放大了数千倍。

但是请考虑一下,如果您不小心,可能会通过撤消它们添加的转义或在末尾添加未转义的内容来损害这些功能的安全性。因此,过滤器很危险。

我需要为此担心吗?

不需要。您只需要担心是否使用了这些过滤器,这些过滤器本身就应该引发大量的红色警报,表明您的开发中出现了严重错误。

功能esc_attresc_html使用是安全的,并逃离内容。如果您重视代码的安全性,则您有道德和道德义务使用它们

这是否意味着我应该使用esc_html

不,逃避就是建立期望。如果您需要一个属性,请使用esc_attr。仅仅因为目前功能相同,并不意味着将来不会因安全版本而改变


感谢您的回答。也许我需要改一下我的问题。我更想知道上述两个过滤器的核心实现是否有差异。这确实有助于我们(开发人员)了解转义如何在属性和HTML中工作。
djadmin

这些过滤器不被Core使用,如果需要,它们提供给插件。但是出于安全原因,我强烈建议您不要使用它们
Tom J Nowell

“因此esc_html和attribute_escape过滤器非常危险。” 我真的不明白这一点。如果我们不使用它,那么我们应该如何转义用户输入以防止XSS?
djadmin

如您所说,它们在退出之前先经过过滤器。我最初的问题是,这两个过滤器的实现方式有何不同?我相信在某些情况下,esc_html过滤器逃逸和attribute_escape过滤器不会逃逸,反之亦然。
djadmin

他们没有。过滤器是为第三方代码提供的,Core并未使用。Core不会挂接到筛选器,也不会对它们执行任何操作。这些极端的情况需要由主题或插件开发人员编写,这时很明显,因为您将是编写它的人
Tom J Nowell
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.