从安全的角度来看,应该转义BloInfo()或Get_BloomInfo()吗?

时间:2013-01-14 作者:Paul Graham

我已经回顾了很多关于WP主题和插件安全性的信息,并且理解了应该在主题和插件中转义属性和HTML值的概念。我看到了bloginfo()echo get_bloginfo() 用于标准和内部esc_html()esc_attr() 作用

Genesis_s, Automatic的基本主题都会转义这些值,但WP自己的codex主题标准指南并没有说明任何关于转义这些值的内容。我查过WP代码(wp-includes/option.php) 似乎对传递的值进行了一些清理get_option() 但它看起来也有一个过滤器,插件可以覆盖某些值。

正是这一事实让我想到应该逃走。有人能给我一些启发吗?

1 个回复
最合适的回答,由SO网友:chrisguitarguy 整理而成

我们必须更深入地了解一下,才能得到您问题的答案。

所以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_html 在一个函数中,WP使用它自己的挂钩系统来做事情。找到发生这种情况的地方是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.

结束