Güvenlik açısından bloginfo () veya get_bloginfo () kullanılmalı mıdır?


10

WP teması ve eklenti güvenliği hakkında birçok bilgiyi gözden geçiriyorum ve temalar ve eklentilerdeki özniteliklerden ve HTML değerlerinden kaçmanız gerektiği kavramını anladım. Hem standart hem de bir veya fonksiyonun içinde gördüm bloginfo()ve echo get_bloginfo()kullandım .esc_html()esc_attr()

Genesis ve _s , Automattic'in temel teması bu değerlerden kaçar, ancak WP'nin kendi kodeks tema standartları kılavuzu bu değerlerden kaçmakla ilgili bir şey söylemez. Ben WP kodu (wp-includes/option.php)içine baktımve küçük bir sanitizasyon geçirilenget_option()var gibi görünüyor ama aynı zamanda bir eklenti belirli değerler için üzerine bir filtre var gibi görünüyor.

Beni kaçması gerektiğini düşünmeye iten bu gerçek. Birisi beni bu konuda aydınlatabilir mi?

Yanıtlar:


15

Sorunuza cevap bulmak için biraz daha derinlemesine bakmalıyız.

Yani, bloginfobasit bir sargı get_bloginfo.

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

İkinci argümana dikkat edin display. Bakalım bunun ne işe yaradığını.

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

Filtre displayçıkışına ayarlanmışsa, get_bloginfobir filtre vasıtasıyla çalıştırılır.

esc_htmlWP, bir işlevdeki çağrı gibi bir şeyi sabit kodlamak yerine , işleri yapmak için kendi kanca sistemini kullanır. Bunun gerçekleştiği yeri bulabileceğiniz yer wp-includes/default-filters.php. bloginfoBu dosyada yapılan hızlı bir arama ...

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

bloginfoforeachdizide gizlidir . Gördüğünüz gibi, çıktısı bloginfokaçtı esc_html.

Başka bir deyişle, bu:

<?php
bloginfo('name');

Buna eşdeğerdir:

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

Veya bu:

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

Yani, hayır, çıktısının bloginfokaçmasına gerek yok. Ayrıca get_bloginfoikinci argüman olarak ayarlandığı sürece çıktı da alınmaz display.

Ancak uyarı, herkesin esc_htmlfiltreyi çıkarabilmesidir bloginfo. Yani sadece çıktıdan kaçmak daha güvenli. Ve elbette, bloginfoHTML ekranından başka bir şey için çıktı kullanıyorsanız (örneğin bir görüntünün alt özelliğinde), bunu çalıştırmanız gerekir esc_attr.


Filtre kullanımının tanıtıldığı sürümü kontrol etmeye değer olabilir. Bu kodu içermeyen eski bir sürümde yayınlanan _s ve genesis olabilir.
Mark Kaplun

2
esc_htmlbloginfo 2.8'ten
14:13 '

Müthiş cevap, teşekkürler. Sadece şimdi WP bağırsaklarına giriyorum ve bloginfo'nun bir get_bloginfo sarıcı olduğu açık olsa da, çıktının sterilize edildiği net değildi. Filtreleri kaçırdım. Belki de WP veritabanına giren ve çıkan kodu nasıl işlediğini daha aşina olmalıdır. Başladığım zamana benzer bir bakış açısıyla kaldım ama en azından neden şimdi biliyorum :)
Paul Graham
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.