Dal punto di vista della sicurezza, bloginfo () o get_bloginfo () dovrebbe essere evitato?


10

Ho esaminato molte informazioni sulla sicurezza dei temi e dei plugin di WP e ho compreso il concetto che dovresti sfuggire agli attributi e ai valori HTML nei temi e nei plugin. Ho visto bloginfo()e echo get_bloginfo()usato sia standard che all'interno di una esc_html()o di esc_attr()funzioni.

Genesis e _s , il tema base di Automattic sfuggono entrambi a questi valori, ma la guida agli standard del tema del codice WP non dice nulla sull'evasione di questi valori. Ho esaminato il codice WP (wp-includes/option.php) e sembra che ci sia un po 'di sanificazione dei valori passati,get_option()ma sembra anche che ci sia un filtro che un plugin potrebbe sovrascrivere per determinati valori.

È questo fatto che mi porta a pensare che dovrebbe essere evitato. Qualcuno può illuminarmi su questo?

Risposte:


15

Dobbiamo cercare un po 'più a fondo qui per ottenere una risposta alla tua domanda.

Quindi, bloginfoè un semplice wrapper in giro get_bloginfo.

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

Nota il secondo argomento display. Vediamo cosa fa.

<?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 il filtro è impostato displaysull'uscita di get_bloginfoviene eseguito attraverso un filtro.

Piuttosto che codificare qualcosa come una chiamata esc_htmlin una funzione, WP usa il proprio sistema hook per fare le cose. Il posto dove trovare quello che succede è dentro wp-includes/default-filters.php. Una rapida ricerca bloginfoin quel file rivela ...

<?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è nascosto nella foreachmatrice. Come puoi vedere, l'output di bloginfoviene evaso con esc_html.

In altre parole, questo:

<?php
bloginfo('name');

È equivalente a questo:

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

O questo:

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

Quindi, no, bloginfonon è necessario sfuggire all'output di . Né l'output di get_bloginfofinché il secondo argomento è impostato su display.

L'avvertimento, tuttavia, è che chiunque può rimuovere il esc_htmlfiltro bloginfo. Quindi è probabilmente più sicuro sfuggire all'output. E, naturalmente, se stai utilizzando l'output di bloginfoqualcosa di diverso dalla visualizzazione HTML (ad es. Nell'attributo alt di un'immagine), dovresti eseguirlo esc_attr.


Potrebbe valere la pena verificare la versione in cui è stato introdotto l'uso del filtro. È possibile che quella e la genesi siano state pubblicate in una versione precedente che non includeva questo codice.
Mark Kaplun,

2
esc_htmlè in circolazione dal 2.8, quindi è stato agganciato a bloginfo github.com/WordPress/WordPress/blob/2.8-branch/wp-includes/…
chrisguitarguy

Risposta eccezionale, grazie. Sto solo entrando nelle viscere di WP e anche se per me era chiaro che bloginfo era un wrapper get_bloginfo, non era chiaro che l'output fosse stato disinfettato. Ho perso i filtri. Dovrei forse acquisire maggiore familiarità con il modo in cui WP gestisce il codice che entra ed esce dal database. Sono rimasto con una prospettiva simile a quando ho iniziato, ma almeno so perché adesso :)
Paul Graham,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.