Do ponto de vista de segurança, o bloginfo () ou get_bloginfo () deve ser escapado?

10

Tenho revisado muitas informações sobre o tema WP e a segurança do plug-in e entendo o conceito de que você deve escapar de atributos e valores HTML em temas e plug-ins. Vi que bloginfo() e echo get_bloginfo() usaram padrão e dentro de uma função esc_html() ou esc_attr() .

Gênesis e _s , o tema base da Automattic tanto ignora esses valores, mas o próprio guia de padrões de temas de código do WP faz não diga nada sobre escapar desses valores. Eu olhei para o código WP ( wp-includes/option.php ) e parece que há um pouco de sanitização dos valores passados de get_option() , mas também parece que há um filtro que um plugin pode sobrescrever para certos valores.

É esse fato que me leva a pensar que deve ser escapado. Alguém pode me esclarecer sobre isso?

    
por Paul Graham 14.01.2013 / 03:27

1 resposta

13

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

Portanto, bloginfo é um simples wrapper em torno de 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 display , a saída de get_bloginfo será executada por meio de um filtro.

Em vez de codificar algo como uma chamada para esc_html em uma função, o WP usa seu próprio sistema de gancho para fazer as coisas. O local para descobrir onde isso acontece está em wp-includes/default-filters.php . Uma pesquisa rápida por bloginfo nesse 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'      );
}

bloginfo está oculto na matriz foreach . Como você pode ver, a saída de bloginfo é escapada com esc_html .

Em outras palavras, isso:

<?php
bloginfo('name');

É equivalente a isto:

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

Ou isto:

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

Portanto, não, a saída de bloginfo não precisa ser escapada. Nem a saída de get_bloginfo , desde que o segundo argumento esteja definido como display .

A advertência, no entanto, é que qualquer um pode remover o filtro esc_html de bloginfo . Portanto, é mais seguro apenas escapar da saída. E, claro, se você estiver usando a saída de bloginfo para algo diferente de exibição HTML (por exemplo, no atributo alt de uma imagem), você deve executá-lo através de esc_attr .

    
por chrisguitarguy 14.01.2013 / 03:41