Чи варто уникати блогу bloginfo () або get_bloginfo () з точки зору безпеки?


10

Я переглядав багато інформації про тему WP та захист плагінів і розумію концепцію, що вам слід уникати атрибутів та значень HTML у темах та плагінах. Я бачив bloginfo()і echo get_bloginfo()використовував як стандартні, так і всередині esc_html()або esc_attr()функції.

Генезис та _s , основна тема Automattic обидва уникають цих значень, але власний посібник із тематичних стандартів кодексу WP нічого не говорить про уникнення цих значень. Я переглянув WP-код (wp-includes/option.php), і, здається, що від цього було зроблено невелику санітарію значень,get_option()але це також виглядає так, що є фільтр, з якого плагін міг би замінити певні значення.

Саме цей факт підводить мене до думки, що слід уникати цього. Чи може хтось просвітити мене на цьому?

Відповіді:


15

Тут ми повинні заглянути трохи глибше, щоб отримати відповідь на ваше запитання.

Отже, 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.


Можливо, варто перевірити версію використання фільтра. Можливо, це _s та genesis, коли вони опубліковані в старій версії, яка не включала цей код.
Марк Каплун

2
esc_htmlіснує приблизно з 2.8, тому він підключений до bloginfo github.com/WordPress/WordPress/blob/2.8-branch/wp-includes/…
chrisguitarguy

Дивовижна відповідь, дякую. Я лише зараз потрапляю в кишки WP, і хоча мені було зрозуміло, що bloginfo - це обгортка get_bloginfo, було не ясно, що продукція санітується. Я пропустив фільтри. Мені, можливо, варто ознайомитись із тим, як WP обробляє код, який входить і залишає базу даних. У мене схожий прогноз, як коли я починав, але принаймні я знаю чому зараз :)
Пол Грем
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.