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


10

私はWPのテーマとプラグインのセキュリティに関する多くの情報を見直しており、テーマとプラグインの属性とHTML値をエスケープする必要があるという概念を理解しています。私が見てきたbloginfo()echo get_bloginfo()の両方の標準および内部で使用esc_html()またはesc_attr()機能。

Automatticの基本テーマである Genesis _sはどちらもこれらの値をエスケープしますが、WP独自のcodexテーマ標準ガイドはこれらの値のエスケープについて何も述べていません。私はWPコード(wp-includes/option.php)を調べましたが、渡されget_option()た値が少し無害化されているようですが、プラグインが特定の値を上書きできるフィルターもあるようです。

それを逃れるべきだと私が考えるようになったのはこの事実です。誰かがこれについて教えてくれますか?

回答:


15

私たちはあなたの質問に対する答えを得るために、ここをもう少し深く見る必要があります。

したがって、のbloginfo周りの単純なラッパーget_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を介して実行されます。

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'      );
}

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

つまり、これは:

<?php
bloginfo('name');

これと同等です:

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

またはこれ:

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

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

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


フィルターの使用が導入されたバージョンを確認する価値があるかもしれません。このコードが含まれていない古いバージョンで_sとGenesisが公開された可能性があります。
Mark Kaplun、2013年

2
esc_html2.8以降に存在しているため、bloginfo github.com
WordPress /

素晴らしい答え、ありがとう。私はたった今WPの内臓に取り掛かっています。bloginfoがget_bloginfoラッパーであることが私には明らかでしたが、出力がサニタイズされていることは明らかではありませんでした。フィルターを逃しました。データベースに出入りするコードをWPがどのように処理するかについては、もっとよく知っておくべきでしょう。私は始めたときと同じような見通しを残していますが、少なくとも今は理由がわかります:)
Paul Graham
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.