Z punktu widzenia bezpieczeństwa należy uciec od bloginfo () lub get_bloginfo ()?


10

Przeglądałem wiele informacji na temat bezpieczeństwa motywu WP i wtyczek i rozumiem pojęcie, że należy unikać atrybutów i wartości HTML w motywach i wtyczkach. Widziałem bloginfo()i echo get_bloginfo()użyłem zarówno standardowej, jak i wewnątrz funkcji esc_html()lub esc_attr().

Geneza i _s , podstawowy motyw Automattic, zarówno uciekają od tych wartości, ale własny przewodnik po standardach tematycznych kodeksu WP nie mówi nic o ucieczce od tych wartości. Zajrzałem do kodu WP (wp-includes/option.php) i wygląda na to, że jest trochę dezynfekcji przekazywanych wartości,get_option()ale wygląda też na to, że istnieje filtr, który wtyczka może zastąpić dla niektórych wartości.

Ten fakt prowadzi mnie do myślenia, że ​​należy tego uniknąć. Czy ktoś może mnie o tym oświecić?

Odpowiedzi:


15

Musimy przyjrzeć się nieco głębiej, aby uzyskać odpowiedź na twoje pytanie.

Tak, bloginfojest proste otoki wokół get_bloginfo.

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

Zwróć uwagę na drugi argument display. Zobaczmy, co to robi.

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

Jeśli filtr jest ustawiony displayna wyjście, get_bloginfoprzechodzi przez filtr.

Zamiast kodować coś jak wywołanie esc_htmlfunkcji, WP używa własnego systemu haków do robienia różnych rzeczy. Miejsce, w którym można to znaleźć, znajduje się w wp-includes/default-filters.php. Szybkie wyszukiwanie bloginfow tym pliku ujawnia ...

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

bloginfojest ukryty w foreachtablicy. Jak widać, dane wyjściowe bloginfozostają usunięte esc_html.

Innymi słowy, to:

<?php
bloginfo('name');

Jest to równoważne z tym:

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

Albo to:

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

Więc nie, wyjście bloginfonie musi być ucieczką. Dane wyjściowe nie są get_bloginfotak długo, jak długo ustawiony jest drugi argument display.

Zastrzeżeniem jest jednak to, że każdy może usunąć esc_htmlfiltr bloginfo. Prawdopodobnie bezpieczniej jest po prostu uciec od wyjścia. I oczywiście, jeśli używasz wyjścia bloginfoinnego niż wyświetlanie HTML (np. W atrybucie alt obrazu), powinieneś go uruchomić esc_attr.


Może warto sprawdzić wersję, w której zastosowano filtr. Możliwe, że _s i geneza zostały opublikowane w starszej wersji, która nie zawierała tego kodu.
Mark Kaplun

2
esc_htmlistnieje od 2.8, więc jest podłączony do bloginfo github.com/WordPress/WordPress/blob/2.8-branch/wp-includes/...
chrisguitarguy

Świetna odpowiedź, dzięki. Dopiero teraz wchodzę w sedno WP i chociaż było dla mnie jasne, że bloginfo było opakowaniem get_bloginfo, nie było jasne, czy dane wyjściowe są odkażane. Brakowało mi filtrów. Być może powinienem lepiej poznać sposób, w jaki WP obsługuje kod, który wchodzi i opuszcza bazę danych. Mam podobne perspektywy, jak na początku, ale przynajmniej wiem, dlaczego teraz :)
Paul Graham
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.