如果the_content不是,为什么还要逃脱?


8

内置函数the_content通过多个过滤器运行,但不会转义输出。这样做很难,因为必须允许HTML甚至某些脚本通过。

输出时,the_content似乎通过以下过滤器运行(从5.0开始):

add_filter( 'the_content', 'do_blocks', 9 );
add_filter( 'the_content', 'wptexturize' );
add_filter( 'the_content', 'convert_smilies', 20 );
add_filter( 'the_content', 'wpautop' );
add_filter( 'the_content', 'shortcode_unautop' );
add_filter( 'the_content', 'prepend_attachment' );
add_filter( 'the_content', 'wp_make_content_images_responsive' );

(and)

add_filter( 'the_content', 'capital_P_dangit' );
add_filter( 'the_content', 'do_shortcode' );

它还做一个简单的字符串替换:

$content = str_replace( ']]>', ']]>', $content );

然后,get_the_content进行与“更多”链接有关的少量处理,以及与外语有关的错误。

这些都不能阻止XSS脚本注入,对吗?

保存时,数据通过wp_kses_post消毒。但是由于这是一个昂贵的过程,所以我理解为什么不将其用于输出。

WordPress转义的经验法则是,无论输入环境如何,都应尽可能逃避一切。我已经读过几篇文章,这是因为不应将数据库视为可信源。

但是由于上述原因,the_content没有遵循该要求。核心主题(即Twenty19ineteen)也没有在输出中添加其他转义。

那么...为什么要帮助任何东西逃到别处?如果我是有权访问数据库的黑客,我是否只会将代码添加到帖子的内容中?


您忘记了wp_kses_post
Tom J Nowell

它在输出上通过wp_kses_post运行吗?哪里?
tmdesignd

Answers:


10

如果我是有权访问数据库的黑客,我是否只会将代码添加到帖子的内容中?

如果您有权访问数据库,则很有可能您拥有足够的访问权,转义并不会阻止您。如果您被黑客入侵,转义并不会帮助您。不应该这样 还有其他逃跑的原因。我能想到的两个主要因素是:

处理未消毒的输入

WordPress发布内容在保存时会被清除,但并非所有其他内容都被清除。例如,未对通过URL中的查询字符串传递的内容进行清理。翻译文件中的内容也没有必要。这两种内容都是与受感染网站无关的内容。因此,需要转义从URL提取的可翻译文本和内容。

为了防止用户意外破坏标记

转义不仅是为了安全。您还需要它,以防止用户意外破坏其网站的标记。例如,如果用户>在插件的某些内容中放置引号或符号会破坏标记,那么您应该转义该输出。您不希望在对输入进行清理时过于激进,因为有完全正当的理由,用户可能想要使用这些字符。


“逃避不仅是要防止坏人。这只是使我们的软件具有持久性。反对随机的错误输入,恶意输入或恶劣的天气。”

这是从WordPress VIP指南中进行的转义。在这个问题上还有很多话要说,您应该阅读一下。


谢谢,这是有帮助的。我读了一篇有关VIP逃逸的文章,作者特别提到了有人可以访问数据库而不是服务器的想法。但是,我认为您在这一点上的推理更有意义。而且,我想,有时您会从数据库中逃避易受攻击的内容,即使没有人拥有对数据库的完全访问权限(例如,通过插件甚至是评论)也是如此。
tmdesignd

9

我实际上是VIP的一名工程师,他进行了大量的代码审查:)我标记了很多丢失的转义字符。

但不会转义输出

不完全是,它不能逃脱输出,这对于大多数人来说是令人惊讶的。这是因为,如果您是超级管理员,则具有此unfiltered_html功能,因此它无法逃脱输出。而是通过wp_kses_post输入运行它。理想情况下,您应该删除该功能。

这是当前时间的实现:

function the_content( $more_link_text = null, $strip_teaser = false ) {
    $content = get_the_content( $more_link_text, $strip_teaser );

    /**
     * Filters the post content.
     *
     * @since 0.71
     *
     * @param string $content Content of the current post.
     */
    $content = apply_filters( 'the_content', $content );
    $content = str_replace( ']]>', ']]>', $content );
    echo $content;
}

the_content另一方面,逃避通过过滤器的任何内容的理想机制是:

echo apply_filters( 'the_content', wp_kses_post( $content ) );

通过这种方式,我们可以使内容安全,然后通过过滤器运行内容,避免去除嵌入物等。

那为什么要逃跑

转义的目的是生成有效的HTML,它提供的附加安全性只是一个不错的副作用。

为了防止用户意外破坏标记

有很多原因可以逃脱,但是从根本上讲,您正在执行期望。采取以下代码:

<a href="<?=$url?>">

我们期望$url包含适合href属性的URL ,但是如果不适合该属性怎么办?那么为什么要让它偶然,让我们执行它:

<a href="<?=esc_url( $url )?>">

现在,它将始终是URL。黑客是否将图片放在$url,用户输入的字段是否错误,是否存在恶意脚本都没关系。它将始终是有效的URL,因为我们说过它将是URL。当然,这可能是一个非常奇怪的URL,但是它将始终满足URL在那里的期望。这非常方便,可以用于标记验证,安全性等

话虽如此,转义不是验证,转义不是消毒。这些是在生命周期中不同时刻发生的单独步骤。逃避迫使事情达到期望,即使它使他们达到了期望。

有时我想将逃脱视为日本游戏节目之一,带有巨大的泡沫墙并带有切口。参赛者必须适应狗的形状,否则将被丢弃,仅出于我们的目的,洞周围有激光和刀具。最后剩下的将是狗形的,如果您还没有狗形,那将是无情和严格的。

记得:

  • 尽早消毒
  • 尽早验证
  • 迟到
  • 经常逃跑

安全是一个多步骤,多层防御的洋葱,逃逸是输出防御的外层之一。它可以破坏受感染站点上的攻击代码,使其变得无用,阻碍公开利用,并确保您的客户端不会通过将标签放置在不应该使用的字段中来破坏站点。它不能替代其他东西,它是迄今为止开发人员手册中使用最多的安全工具。

至于为什么不逃脱the_content呢?如果洪水泛滥,墙壁上有5个洞,但只有时间修复3个,您耸耸肩也不修复任何东西吗?还是减轻风险并减少攻击范围?

也许我可以通过以下代码片段帮助解决最后的两个漏洞:

add_filter( 'the_content' function( $content ) {
    return wp_kses_post( $content );
}, PHP_INT_MAX + 1 );

在这里,我们将优先级设置为PHP中可能的最高数字,然后加1,这样它就会溢出到可以表示的最低数字。这样,所有对的调用the_content将先于其他过滤器转义该值。这样,嵌入等仍然有效,但是用户无法通过数据库潜入危险的HTML。此外,请考虑unfiltered_html从所有角色中删除该功能


1
感谢您的其他观点。我实际上已经在您的网站上阅读了有关该主题的文章,并且一直想知道您是否有任何补充。
tmdesignd

4

转义的目的是生成有效的HTML,它提供的附加安全性只是一个不错的副作用。

应用于内容的过滤器从HTML和其他文本(具有短代码等其他语法)的混合体中生成有效的HTML。某些内容已经是有效的HTML的事实阻止了对所有内容应用转义。

对于kses相关功能,您之所以不能应用它们,主要是因为您没有足够的上下文来知道要使用哪个功能。例如,可能存在某些使用the_content过滤器将JS添加到帖子内容中的过程,因此,如果JS是否合法,核心将无法基于帖子作者之类的东西进行猜测。

那么...为什么要帮助任何东西逃到别处?如果我是有权访问数据库的黑客,我是否只会将代码添加到帖子的内容中?

同样,转义用于生成有效的HTML。从安全性的角度来看,转义并不是提供安全性,而是阻止转义的代码应该是可疑的,因为它可能更容易被利用。例如,核心使用_e翻译的方式和'__'意味着任何可以说服您安装非官方翻译的人都可能会添加难以检测到翻译文件中的JS并入侵您的网站的方法。这是“做我说的而不是我做的”的一个很好的例子。


谢谢马克,提供了其他观点。
tmdesignd

2

如果我是有权访问数据库的黑客,我是否只会将代码添加到帖子的内容中?

我认为您的问题可以解决。如果您是有权访问数据库的黑客,那么您已经获得了所需的访问权限。转义输出根本不会改变它。

逃避输出的原因是评估不受信任的数据,以避免黑客首先获得该访问权限。


感谢您的回答。我想我太专注于防止黑客以为我错过了森林的想法。
tmdesignd
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.