Dari sudut pandang keamanan, haruskah bloginfo () atau get_bloginfo () diloloskan?

10

Saya telah meninjau banyak informasi tentang tema WP dan keamanan plugin dan memahami konsep bahwa Anda harus melarikan diri atribut dan nilai-nilai HTML dalam tema dan plugin. Saya telah melihat bloginfo()dan echo get_bloginfo()menggunakan standar dan di dalam esc_html()atau esc_attr()fungsi.

Genesis dan _s , tema dasar Automattic sama-sama lolos dari nilai-nilai ini tetapi panduan standar tema kodeks WP sendiri tidak mengatakan apa-apa tentang melarikan diri dari nilai-nilai ini. Saya telah melihat ke dalam kode WP (wp-includes/option.php) dan sepertinya ada sedikit sanitasi nilai yang diteruskanget_option()tetapi juga sepertinya ada filter yang dapat ditimpa oleh plugin untuk nilai-nilai tertentu.

Fakta inilah yang membuat saya berpikir bahwa itu harus dihindari. Adakah yang bisa memberi tahu saya tentang hal ini?

Paul Graham
sumber

Jawaban:

15

Kami harus melihat sedikit lebih dalam di sini untuk mendapatkan jawaban atas pertanyaan Anda.

Jadi, bloginfoadalah pembungkus sederhana get_bloginfo.

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

Perhatikan argumen kedua display. Mari kita lihat apa yang dilakukannya.

<?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;
}

Jika filter diatur ke displayoutput get_bloginfodijalankan melalui filter.

Daripada hardcode sesuatu seperti panggilan esc_htmldalam suatu fungsi, WP menggunakan sistem kait itu sendiri untuk melakukan sesuatu. Tempat untuk menemukan di mana itu terjadi adalah di wp-includes/default-filters.php. Pencarian cepat bloginfodi file itu mengungkapkan ...

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

bloginfodisembunyikan di dalam foreacharray. Seperti yang Anda lihat, output dari bloginfololos esc_html.

Dengan kata lain, ini:

<?php
bloginfo('name');

Setara dengan ini:

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

Atau ini:

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

Jadi, tidak, output dari bloginfotidak perlu diloloskan. Output juga tidak get_bloginfoselama argumen kedua diatur display.

Namun, peringatannya adalah siapa pun dapat menghapus esc_htmlfilter bloginfo. Jadi sepertinya lebih aman hanya untuk menghindari output. Dan, tentu saja, jika Anda menggunakan output bloginfountuk apa pun selain tampilan HTML (mis. Pada atribut alt gambar), Anda harus menjalankannya esc_attr.

chrisguitarguy
sumber
Mungkin perlu memeriksa versi penggunaan filter diperkenalkan. Mungkin _s dan genesis yang diterbitkan dalam versi yang lebih lama yang tidak termasuk kode ini.
Mark Kaplun
2
esc_htmlsudah ada sejak 2,8, jadi sudah terhubung ke bloginfo github.com/WordPress/WordPress/blob/2.8-branch/wp-includes/…
chrisguitarguy
Jawaban yang luar biasa, terima kasih. Saya baru saja masuk ke nyali WP dan meskipun jelas bagi saya bahwa bloginfo adalah pembungkus get_bloginfo, tidak jelas bahwa output sedang disanitasi. Saya merindukan filter. Saya mungkin harus menjadi lebih akrab dengan bagaimana WP menangani kode yang masuk dan keluar dari database. Saya pergi dengan pandangan yang sama seperti ketika saya mulai tetapi setidaknya saya tahu mengapa sekarang :)
Paul Graham