Desde el punto de vista de la seguridad, ¿deberían escaparse bloginfo () o get_bloginfo ()?

10

He estado revisando mucha información sobre el tema de WP y la seguridad de los complementos y entiendo el concepto de que debe escapar de los atributos y los valores HTML en los temas y complementos. He visto bloginfo()y echo get_bloginfo()utilizado tanto estándar y dentro de una esc_html()o esc_attr()función.

Genesis y _s , el tema base de Automattic, ambos escapan a estos valores, pero la propia guía de estándares de tema de codex de WP no dice nada acerca de escapar de estos valores. He examinado el código WP (wp-includes/option.php) y parece que hay una pequeña desinfección de los valores pasados,get_option()pero también parece que hay un filtro que un complemento podría sobrescribir para ciertos valores.

Es este hecho lo que me lleva a pensar que debería escapar. ¿Alguien puede iluminarme sobre esto?

Paul Graham
fuente

Respuestas:

15

Tenemos que mirar un poco más profundo aquí para obtener una respuesta a su pregunta.

Entonces, bloginfoes un simple envoltorio alrededor get_bloginfo.

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

Observe el segundo argumento display. Veamos qué hace eso.

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

Si el filtro se establece en displayla salida de, get_bloginfose ejecuta a través de un filtro.

En lugar de codificar algo como una llamada a esc_htmluna función, WP usa su propio sistema de enlace para hacer cosas. El lugar para encontrar eso donde sucede es en wp-includes/default-filters.php. Una búsqueda rápida bloginfoen ese archivo 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 en la foreachmatriz. Como puede ver, la salida de bloginfose escapa con esc_html.

En otras palabras, esto:

<?php
bloginfo('name');

Es equivalente a esto:

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

O esto:

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

Por lo tanto, no, la salida de bloginfono necesita escapar. Tampoco la salida de get_bloginfomientras el segundo argumento esté establecido en display.

Sin embargo, la advertencia es que cualquiera puede quitar el esc_htmlfiltro bloginfo. Por lo tanto, es más seguro escapar de la salida. Y, por supuesto, si está utilizando la salida de bloginfoalgo que no sea la visualización HTML (por ejemplo, en el atributo alt de una imagen), debe ejecutarlo esc_attr.

chrisguitarguy
fuente
Puede valer la pena comprobar la versión en la que se introdujo el uso del filtro. Puede ser que _s y génesis se publiquen en una versión anterior que no incluye este código.
Mark Kaplun
2
esc_htmlha existido desde 2.8, por lo que se ha conectado a bloginfo github.com/WordPress/WordPress/blob/2.8-branch/wp-includes/…
chrisguitarguy
Impresionante respuesta, gracias. Recién ahora estoy entrando en las entrañas de WP y, aunque para mí estaba claro que bloginfo era un contenedor get_bloginfo, no estaba claro que la salida se estuviera desinfectando. Extrañé los filtros. Quizás debería familiarizarme más con cómo WP maneja el código que ingresa y sale de la base de datos. Tengo una perspectiva similar a la de cuando comencé, pero al menos sé por qué ahora :)
Paul Graham