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

10

J'ai passé en revue de nombreuses informations sur la sécurité des thèmes et des plug-ins WP et je comprends le concept selon lequel vous devez échapper aux attributs et aux valeurs HTML des thèmes et des plug-ins. J'ai vu que bloginfo() et echo get_bloginfo() utilisaient les fonctions standard et dans une fonction esc_html() ou esc_attr() .

Genesis et _s , le thème de base d'Automattic échappe à ces valeurs, mais le guide de normes de thème du codex de WP ne rien dire à propos d'échapper à ces valeurs. J'ai examiné le code WP ( wp-includes/option.php ) et il semble que les valeurs passées de get_option() soient un peu assainies, mais il semble également qu'il existe un filtre qu'un plugin pourrait écraser pour certaines valeurs.

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

    
posée Paul Graham 14.01.2013 - 03:27

1 réponse

13

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

Ainsi, 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 cela 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 hook pour faire des 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 ceci:

<?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 l’est pas non plus tant que le deuxième argument est défini sur display .

Toutefois, tout le monde 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 via esc_attr .

    
réponse donnée chrisguitarguy 14.01.2013 - 03:41

Lire d'autres questions sur les étiquettes