Sollte aus Sicherheitsgründen bloginfo () oder get_bloginfo () maskiert werden?


10

Ich habe viele Informationen zur Sicherheit von WP-Themen und Plugins überprüft und das Konzept verstanden, dass Sie Attributen und HTML-Werten in Themen und Plugins entgehen sollten. Ich habe sowohl Standard als auch innerhalb einer oder Funktion gesehen bloginfo()und echo get_bloginfo()verwendet .esc_html()esc_attr()

Genesis und _s , das Basisthema von Automattic, entziehen sich diesen Werten, aber der WP-eigene Leitfaden zu Codex-Themenstandards sagt nichts über das Entkommen dieser Werte aus. Ich habe mir den WP-Code (wp-includes/option.php) angesehen und es scheint, dass es eine kleine Bereinigung der übergebenen Werte gibt,get_option()aber es sieht auch so aus, als gäbe es einen Filter, den ein Plugin für bestimmte Werte überschreiben könnte.

Es ist diese Tatsache, die mich zu dem Gedanken führt, dass es entkommen sollte. Kann mich jemand darüber aufklären?

Antworten:


15

Wir müssen hier etwas genauer hinschauen, um eine Antwort auf Ihre Frage zu erhalten.

Also, bloginfoist ein einfacher Wrapper herum get_bloginfo.

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

Beachten Sie das zweite Argument display. Mal sehen, was das macht.

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

Wenn der Filter auf displayden Ausgang von eingestellt get_bloginfoist, wird er durch einen Filter geleitet.

Anstatt so etwas wie einen Aufruf esc_htmlin einer Funktion fest zu codieren, verwendet WP ein eigenes Hook-System, um Dinge zu erledigen. Der Ort, an dem man das findet, ist wp-includes/default-filters.php. Eine schnelle Suche bloginfoin dieser Datei zeigt ...

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

bloginfoist im foreachArray versteckt . Wie Sie sehen können, wird die Ausgabe von mit bloginfomaskiert esc_html.

Mit anderen Worten:

<?php
bloginfo('name');

Ist gleichbedeutend damit:

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

Oder dieses:

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

Also, nein, die Ausgabe von bloginfomuss nicht maskiert werden. Auch die Ausgabe von get_bloginfosolange das zweite Argument auf gesetzt ist display.

Die Einschränkung ist jedoch, dass jeder den esc_htmlFilter entfernen kann bloginfo. Es ist also wahrscheinlich sicherer, nur der Ausgabe zu entkommen. Und wenn Sie die Ausgabe von bloginfofür etwas anderes als die HTML-Anzeige verwenden (z. B. im alt-Attribut eines Bildes), sollten Sie sie natürlich durchlaufen esc_attr.


Es könnte sich lohnen, die Version zu überprüfen, in der der Filter verwendet wurde. Es könnte sein, dass _s und Genesis in einer älteren Version veröffentlicht wurden, die diesen Code nicht enthielt.
Mark Kaplun

2
esc_htmlgibt es seit 2.8, also wurde es in bloginfo github.com/WordPress/WordPress/blob/2.8-branch/wp-includes/…
chrisguitarguy

Super Antwort, danke. Ich bin gerade erst in den Mut von WP geraten und obwohl mir klar war, dass bloginfo ein get_bloginfo-Wrapper ist, war nicht klar, dass die Ausgabe bereinigt wurde. Ich habe die Filter verpasst. Ich sollte mich vielleicht besser damit vertraut machen, wie WP mit Code umgeht, der in die Datenbank eintritt und diese verlässt. Ich habe eine ähnliche Einstellung wie zu Beginn, aber zumindest weiß ich jetzt warum :)
Paul Graham
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.