问题描述

我一直在审查大量关于 WP 主题和插件安全性的信息,并了解您应该在主题和插件中转义属性和 HTML 值的概念。我已经看到 bloginfo()echo get_bloginfo()都使用标准和内部的 esc_html()esc_attr()功能。

创世纪和_s,Automattic 的基础主题都逃避了这些价值观,但 WP 自己的 codex 主题标准指南并没有说出任何逃避这些价值观。我已经研究了 WP 代码 (wp-includes/option.php),似乎有一些消息从 get_option()传递的值,但它也看起来像一个插件可以覆盖某些值的过滤器。

这是事实,导致我认为它应该逃脱。任何人都可以启发我吗?

最佳解决方案

我们必须在这里更深入了解您的问题的答案。

所以 bloginfoget_bloginfo 的简单包装。

<?php
function bloginfo( $show='' ) {
    echo get_bloginfo( $show, 'display' );
}

注意第二个参数 display 。让我们看看这是做什么的。

<?php
function get_bloginfo( $show = '', $filter = 'raw' ) {

    // snip snip, $output is fetched somewhere in here

    if ( 'display' == $filter ) {
        if ( $url )
            $output = apply_filters('bloginfo_url', $output, $show);
        else
            $output = apply_filters('bloginfo', $output, $show);
    }

    return $output;
}

如果过滤器设置为 display,则 get_bloginfo 的输出通过过滤器运行。

WPA 使用它自己的钩子系统来做某事,而不是像一个函数中的 esc_html 一样调用。找到发生的地方在 wp-includes/default-filters.php 的地方。在该文件中快速搜索 bloginfo 显示…

<?php
// Format strings for display.
foreach ( array( 'comment_author', 'term_name', 'link_name', 'link_description', 'link_notes', 'bloginfo', 'wp_title', 'widget_title' ) as $filter ) {
    add_filter( $filter, 'wptexturize'   );
    add_filter( $filter, 'convert_chars' );
    add_filter( $filter, 'esc_html'      );
}

bloginfo 隐藏在 foreach 数组中。您可以看到,bloginfo 的输出使用 esc_html 进行转义。

换句话说,这个:

<?php
bloginfo('name');

相当于:

<?php
echo esc_html(get_bloginfo('name'));

或这个:

<?php
echo get_bloginfo('name', 'display');

所以不,bloginfo 的输出不需要转义。只要第二个参数设置为 displayget_bloginfo 的输出也不会。

但是,请注意,任何人都可以从 bloginfo 中删除 esc_html 过滤器。因此,逃避输出可能更安全。当然,如果您使用 bloginfo 的输出,而不是 HTML 显示 (例如,在图像的 alt 属性中),您应该通过 esc_attr 来运行它。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。