web-dev-qa-db-ja.com

セキュリティの観点から、bloginfo()またはget_bloginfo()はエスケープする必要がありますか?

私はWPテーマとプラグインのセキュリティについて多くの情報を検討してきました。そしてテーマとプラグインで属性とHTML値をエスケープするべきであるという概念を理解しました。私はbloginfo()echo get_bloginfo()が標準とesc_html()またはesc_attr()関数の中で使われているのを見ました。

創世記 _s 、Automatticの基本テーマは両方ともこれらの値をエスケープしますが、WP自身のコーデックステーマ標準ガイドはこれらの値をエスケープすることについて何も言いません。 WPコード(wp-includes/option.php)を調べたところ、get_option()から渡される値のサニタイズが少し行われているようですが、プラグインが特定の値を上書きする可能性があるフィルタもあります。

この事実が、私がそれをエスケープすべきだと考える方向に導いているのです。誰もがこれについて私を啓発することができますか?

10
Paul Graham

私たちはあなたの質問に対する答えを得るためにここでもう少し深く見なければなりません。

したがって、bloginfoget_bloginfoを囲む単純なラッパーです。

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

2番目の引数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の出力はフィルタを通して実行されます。

WPは、関数内で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'      );
}

bloginfoforeach配列に隠されています。ご覧のとおり、bloginfoの出力はesc_htmlでエスケープされます。

言い換えれば、これ:

<?php
bloginfo('name');

これと同等です:

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

またはこれ:

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

したがって、いいえ、bloginfoの出力をエスケープする必要はありません。 2番目の引数がdisplayに設定されている限り、get_bloginfoの出力も行われません。

ただし、注意点は、誰でもbloginfoからesc_htmlフィルタを削除できることです。そのため、出力をエスケープするほうが安全な可能性があります。もちろん、bloginfoの出力をHTML表示以外の目的(たとえば、画像のalt属性など)に使用している場合は、esc_attrを介して実行する必要があります。

15
chrisguitarguy