Du point de vue de la sécurité, faut-il échapper bloginfo () ou get_bloginfo ()?


10

J'ai passé en revue de nombreuses informations sur le thème WP et la sécurité 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()utilisé à la fois la norme et l'intérieur d'une fonction esc_html()ou esc_attr().

Genesis et _s , le thème de base d'Automattic échappent tous deux à ces valeurs, mais le propre guide des normes de thème codex de WP ne dit rien sur l'échappement de ces valeurs. J'ai examiné le code WP (wp-includes/option.php) et il semble qu'il y ait un peu de filtrage des valeurs transmises,get_option()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. est-ce que quelqu'un peut m'éclairer à ce sujet?

Réponses:


15

Nous devons approfondir un peu ici pour obtenir une réponse à votre question.

Donc, bloginfoc'est un simple wrapper get_bloginfo.

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

Remarquez le deuxième argument display. Voyons voir 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 réglé sur displayla sortie de, il get_bloginfopasse par un filtre.

Plutôt que de coder en dur quelque chose comme un appel à esc_htmlune fonction, WP utilise son propre système de hook pour faire les choses. L'endroit pour trouver où cela se produit est wp-includes/default-filters.php. Une recherche rapide bloginfodans 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'      );
}

bloginfoest caché dans le foreachtableau. Comme vous pouvez le voir, la sortie de bloginfos'échappe 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 bloginfon'a pas besoin d'être échappée. La sortie ne get_bloginfodure 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 retirer le esc_htmlfiltre bloginfo. Il est donc plus sûr d'échapper à la sortie. Et, bien sûr, si vous utilisez la sortie de bloginfopour autre chose que l'affichage HTML (par exemple dans l'attribut alt d'une image), vous devez l'exécuter esc_attr.


Il pourrait être utile de vérifier la version dans laquelle l'utilisation du filtre a été introduite. Il se peut que _s et genesis aient été publiés dans une version plus ancienne qui n'incluait pas ce code.
Mark Kaplun

2
esc_htmlexiste depuis la 2.8, il a donc été accroché à bloginfo github.com/WordPress/WordPress/blob/2.8-branch/wp-includes/…
chrisguitarguy

Super réponse, merci. Je viens tout juste d'entrer dans les tripes de WP et même s'il était clair pour moi que bloginfo était un wrapper get_bloginfo, il n'était pas clair que la sortie était en cours de nettoyage. J'ai raté les filtres. Je devrais peut-être me familiariser avec la façon dont WP gère le code qui entre et sort de la base de données. Je suis resté avec une perspective similaire à celle de mes débuts mais au moins je sais pourquoi maintenant :)
Paul Graham
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.