为什么要在内部函数上使用esc_attr()?

时间:2022-01-18 作者:user557108

我在高级主题/插件中看到了很多这样的内容。

#1 - Why would you escape this? It\'s your own data. For consistency?

function prefix_a() {
    $class_attr = \'a b c\';

    // Some more code.

    return \'<div class="\' . esc_attr( $class_attr ) . \'">Content</div>\';
}

// Called somewhere.
prefix_a();

#2 - Again, why? The data doesn\'t come from the DB.

function prefix_b( $class ) {
    // Some code.

    return \'<div class="\' . esc_attr( $class ) . \'">Content</div>\';
}

// Called by a developer from the team.
prefix_b( \'developer adds a class\' );
是的,子主题开发人员可以调用上面的函数,但他/她已经控制了。

#3 - Why? If someone can add filters, it can do a lot more.

function prefix_c() {
    $class_attr = apply_filters( \'prefix_c\', \'foo bar\' );

    // Some code.

    return \'<div class="\' . esc_attr( $class_attr ) . \'">Content</div>\';
}

// Called somewhere.
prefix_c();
如果有人使用不受信任的数据(不包括#1案例),我只能考虑一致性和安全性。

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

你可能不会这样做。如果你这样做了,那就是要确保它已经到位,如果将来你决定让变量动态或可过滤$class 是从现在开始的,但这在将来可能会发生变化,它为函数在不同环境中的潜在使用做好了准备$class 可能无法控制$class 可能是,如果传递了不正确的值,您应该确保代码不会中断。这不仅仅是一个安全问题。正如您将从本网站上的以下问题中学到的,许多使用过滤器的开发人员不一定知道他们在做什么。他们可能编写接受动态值的代码,并使用过滤器将其添加为类。大多数情况下,这可能没什么问题,但如果他们自动插入一些内容,比如帖子标题,那会怎么样?最终可能会有一个带有" 字符,如果不从该筛选器中转义值,则这将破坏其站点的标记。一个有经验的开发人员会知道问题所在并自己解决,但并非所有可能使用您的过滤器的开发人员都有这样的经验

SO网友:Sébastien Serre

我认为最好的答案是在官方文件中:https://developer.wordpress.org/plugins/security/securing-output/

相关推荐

Escaping SVG with KSES

我试图在模板中输出SVG文件,PHPCS告诉我需要转义输出。所以我尝试使用KSES,但它似乎不想包含viewbox属性。 $allowed_html = array( \'svg\' => array( \'xmlns\' => array (), \'viewBox\' => true ), \'path\' => array( \'d\'=> array(), ), )