web-dev-qa-db-fra.com

Du point de vue de la sécurité, bloginfo () ou get_bloginfo () doit-il être échappé?

J'ai passé en revue de nombreuses informations sur WP la sécurité des thèmes et des plugins et je comprends le concept selon lequel vous devez échapper les attributs et les valeurs HTML dans les thèmes et les plugins. J'ai vu bloginfo() et echo get_bloginfo() utiliser à la fois les fonctions standard et esc_html() ou esc_attr().

Genèse et _s , Le thème de base d'Automattic échappe à ces valeurs, mais le propre guide des normes de codex pour les thèmes de WP ne dit rien sur le fait d'échapper à ces valeurs. J'ai examiné le code WP (wp-includes/option.php) et il semble que les valeurs transmises depuis get_option() soient un peu assainies, mais il semble également qu'un filtre puisse remplacer certaines valeurs par un filtre.

C'est ce fait qui m'amène à penser qu'il faut y échapper. est-ce que quelqu'un peut m'éclairer à ce sujet?

10
Paul Graham

Nous devons regarder un peu plus loin ici pour obtenir une réponse à votre question.

Donc, bloginfo est un simple wrapper autour de get_bloginfo.

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

Notez le deuxième argument display. Voyons ce que ça fait.

<?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 le filtre est défini sur display, la sortie de get_bloginfo est exécutée via un filtre.

Plutôt que de coder en dur quelque chose comme un appel à esc_html dans une fonction, WP utilise son propre système de points d'ancrage pour faire les choses. L'endroit où trouver cela se trouve est dans wp-includes/default-filters.php. Une recherche rapide de bloginfo dans ce fichier révèle ...

<?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 caché dans le tableau foreach. Comme vous pouvez le constater, la sortie de bloginfo est échappée avec esc_html.

En d'autres termes, ceci:

<?php
bloginfo('name');

Est équivalent à ceci:

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

Ou ca:

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

Donc, non, la sortie de bloginfo n'a pas besoin d'être échappée. La sortie de get_bloginfo ne le fait pas non plus tant que le deuxième argument est défini sur display.

La mise en garde, cependant, est que n'importe qui peut supprimer le filtre esc_html de bloginfo. Il est donc probablement plus sûr d’échapper à la sortie. Et, bien sûr, si vous utilisez la sortie de bloginfo pour autre chose que l'affichage HTML (par exemple, dans l'attribut alt d'une image), vous devez l'exécuter à travers esc_attr.

15
chrisguitarguy