事实上,我是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
所有角色的能力