如果内容不是,为什么要逃走?

时间:2019-03-27 作者:tmdesigned

内置功能the_content 运行多个筛选器,但不转义输出。要做到这一点很困难,因为必须允许HTML甚至某些脚本通过。

输出时,\\u内容似乎通过这些过滤器运行(从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\\u\\u内容会进行一些与“更多”链接和外语错误相关的处理。

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

保存时,数据is 通过wp\\U kses\\U post进行消毒。但由于这是一个昂贵的过程,我理解为什么它不用于输出。

WordPress转义的经验法则是,无论输入环境如何,都需要转义所有内容,并且尽可能晚。我读过几篇这样的文章,因为数据库不能被视为可信的来源。

但由于上述原因,\\u的内容并不是这样的。核心主题(即Twenty199)也没有在输出上添加额外的转义。

所以为什么它能帮助任何人逃到别处?如果我是一个可以访问数据库的黑客,我会不会把我的代码添加到帖子的内容中?

4 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

如果我是一个可以访问数据库的黑客,我会不会把我的代码添加到帖子的内容中?

如果您有权访问数据库,那么很可能您有足够的访问权限,因此逃跑不会阻止您。如果你被黑客攻击了,逃跑对你没有帮助。这是不应该的。还有其他逃跑的理由。我能想到的两个主要问题是:

To deal with unsanitized input

WordPress post内容在保存时会被消毒,但并非所有其他内容都会被消毒。例如,通过URL中的查询字符串传递的内容没有经过清理。翻译文件中的内容也不一定。这两者都是与网站被破坏无关的内容来源。因此,需要转义从URL中提取的可翻译文本和内容。

To prevent users accidentally breaking markup

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

“逃跑不仅仅是为了保护我们的软件免受坏人的攻击。它只是让我们的软件更耐用。可以抵御随机的不良输入、恶意输入或恶劣天气。”

那是从WordPress VIP guidelines on escaping. 关于这件事,它还有很多要说的,你应该读一读。

SO网友:Tom J Nowell

事实上,我是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 属性,但如果不是呢?那么,为什么要听天由命,让我们来实施它:

<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 将在任何其他筛选器之前转义该值。这种嵌入etc的方式仍然有效,但用户不能通过数据库潜入危险的HTML。此外,请查看移除unfiltered_html 所有角色的能力

SO网友:Mark Kaplun

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

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

至于kses 相关函数,您不能应用它们,主要是因为您没有足够的上下文来知道要使用哪个函数。例如,可能有某个进程使用the_content 过滤器将JS添加到帖子内容中,因此核心无法根据帖子作者之类的信息猜测JS是否合法。

所以为什么它能帮助任何人逃到别处?如果我是一个可以访问数据库的黑客,我会不会把我的代码添加到帖子的内容中?

同样,转义是为了生成有效的HTML。从安全角度来看,不是逃跑提供了安全性,而是侥幸逃脱的代码应该是可疑的,因为它可能更容易被利用。例如,core使用_e 对于翻译,“\\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。这是“照我说的做,而不是照我做”的一个很好的例子。

SO网友:butlerblog

如果我是一个可以访问数据库的黑客,我会不会把我的代码添加到帖子的内容中?

我想你的问题已经回答了。如果您是一名有权访问数据库的黑客,那么您已经获得了所需的访问权限。转义输出根本不会改变这一点。

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

相关推荐

Security updates to 3.3.2

我知道所有的安全更新都很重要,但从1到10的范围来看,从3.1.3升级到3.3.2有多重要。我有一些网站需要升级,但主机将我锁定在一个旧版本的php中,限制我使用3.1.3。我目前正在运行php的5.2.3版本。谢谢Bart