Do ponto de vista de segurança, bloginfo () ou get_bloginfo () devem ser escapados?

10

Estive revisando muitas informações sobre a segurança de plug-ins e temas WP e entendi o conceito de que você deve escapar de atributos e valores HTML em temas e plug-ins. Eu já vi bloginfo()e echo get_bloginfo()usei padrão e dentro de uma função esc_html()ou esc_attr().

Gênesis e _s , o tema base da Automattic escapam desses valores, mas o próprio guia de padrões de temas do WP não diz nada sobre como escapar desses valores. Analisei o código WP (wp-includes/option.php) e parece que há um pouco de higienização dos valores passados,get_option()mas também parece que há um filtro que um plug-in pode substituir por determinados valores.

É esse fato que me leva a pensar que deveria escapar. Alguém pode me esclarecer sobre isso?

Paul Graham
fonte

Respostas:

15

Temos que olhar um pouco mais aqui para obter uma resposta para sua pergunta.

Então, bloginfoé um invólucro simples get_bloginfo.

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

Observe o segundo argumento display. Vamos ver o que isso faz.

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

Se o filtro estiver definido como displaya saída de, get_bloginfoserá executado um filtro.

Em vez de codificar algo como uma chamada esc_htmlem uma função, o WP usa seu próprio sistema de gancho para fazer as coisas. O lugar para descobrir onde é que isso acontece wp-includes/default-filters.php. Uma pesquisa rápida bloginfonesse arquivo revela ...

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

bloginfoestá oculto na foreachmatriz. Como você pode ver, a saída de bloginfoé escapada esc_html.

Em outras palavras, isso:

<?php
bloginfo('name');

É equivalente a isso:

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

Ou isto:

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

Portanto, não, a saída de bloginfonão precisa ser escapada. Nem a saída get_bloginfoenquanto o segundo argumento estiver definido como display.

A ressalva, no entanto, é que qualquer pessoa pode remover o esc_htmlfiltro bloginfo. Portanto, é mais seguro escapar da saída. E, é claro, se você estiver usando a saída de bloginfoalgo diferente de exibição em HTML (por exemplo, no atributo alt de uma imagem), você deve executá-la esc_attr.

chrisguitarguy
fonte
Pode valer a pena verificar a versão em que o uso do filtro foi introduzido. Pode ser que _s e genesis tenham sido publicados em uma versão mais antiga que não incluísse esse código.
Mark Kaplun
2
esc_htmlexiste desde 2.8, por isso tem de ser viciado em bloginfo github.com/WordPress/WordPress/blob/2.8-branch/wp-includes/...
chrisguitarguy
Resposta incrível, obrigado. Só agora estou entrando no clima do WP e, embora tenha ficado claro para mim que o bloginfo era um wrapper get_bloginfo, não estava claro que a saída estava sendo higienizada. Eu perdi os filtros. Talvez eu deva me familiarizar com a forma como o WP lida com o código que entra e sai do banco de dados. Eu estou à esquerda com uma perspectiva semelhante como quando eu comecei, mas pelo menos eu sei por que agora :)
Paul Graham