从安全角度来看,应该转义bloginfo()或get_bloginfo()吗?


10

我一直在审查有关WP主题和插件安全性的许多信息,并了解应该在主题和插件中转义属性和HTML值的概念。我已经看过bloginfo()echo get_bloginfo()esc_html()or esc_attr()函数中使用了标准和内部代码。

创世纪(Genesis) _s(Automattic的基本主题)都逃避了这些值,但是WP自己的法典主题标准指南并未说明如何转义这些值。我已经研究了WP代码(wp-includes/option.php),似乎对传入的值进行了一些清理,get_option()但也似乎有一个过滤器,插件可以覆盖某些值。

正是这一事实使我想到应该逃脱它。有人可以启发我吗?

Answers:


15

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

因此,bloginfo是一个简单的包装器get_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通过过滤器运行。

esc_htmlWP 并不是使用硬编码(例如调用函数中的调用),而是使用它自己的挂钩系统来执行操作。找到发生这种情况的地方是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不需要转义的输出。get_bloginfo只要第二个参数设置为,输出也不行display

但要注意的是,任何人都可以从中删除esc_html过滤器bloginfo。因此,仅逃避输出可能更安全。而且,当然,如果将的输出bloginfo用于除HTML显示之外的任何内容(例如,在图像的alt属性中),则应通过进行运行esc_attr


可能值得检查引入过滤器使用的版本。_s和起源可能是在不包含此代码的旧版本中发布的。
马克·卡普伦

2
esc_html自2.8以来一直存在,所以它已经被钩到bloginfo github.com/WordPress/WordPress/blob/2.8-branch/wp-includes/…–
chrisguitarguy

很棒的答案,谢谢。我只是现在才进入WP的范畴,尽管对我来说很明显bloginfo是一个get_bloginfo包装器,但不清楚是否正在清理输出。我错过了筛选器。我也许应该更熟悉WP如何处理进入和离开数据库的代码。我的前景与开始时类似,但至少我现在知道为什么:)
Paul Graham
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.