wake-up-neo.net

Soll get_template_directory_uri () maskiert werden?

Soll get_template_directory_uri() mit esc_url() ausgeblendet werden?

Ich frage, weil am Beispiel des Standardthemas Twenty Fifteen dieselbe Funktion an zwei verschiedenen Stellen verwendet wird, aber nur an einer davon ausgeblendet wird.

wp_enqueue_style( 'twentyfifteen-ie', get_template_directory_uri() . '/css/ie.css', array( 'twentyfifteen-style' ), '20141010' );

-

<script src="<?php echo esc_url( get_template_directory_uri() ); ?>/js/html5.js"></script>

Ich würde sagen, dass get_template_directory_uri() nicht generiert werden muss, da die URL nicht extern manipuliert werden kann.

6
grappler

In dieser Funktion finden wir einen Haken:

return apply_filters( 
    'template_directory_uri', 
    $template_dir_uri, 
    $template, 
    $theme_root_uri
);

Also, ja, der URI kann durch Plugins geändert werden, und Sie sollten seinen zurückgegebenen Wert entziehen.

Das gleiche Prinzip gilt für alle WordPress-URI-Funktionen wie get_home_url(), get_site_url() und so weiter. Denken Sie daran, dass es nicht nur gute Plugin-Entwickler gibt. Einige machen Fehler, vielleicht nur sehr kleine, die nur unter bestimmten Umständen passieren.

Im Fall von wp_enqueue_style() wird die URL standardmäßig durch WordPress does ausgeblendet. Dies ist jedoch ein Wrapper für die Instanz global WP_Styles, und diese wiederum kann leicht ersetzt werden - auch mit einer weniger sicheren Version. Das ist nicht sehr wahrscheinlich, aber Sie sollten sich dieser Möglichkeit bewusst sein.

Leider folgt WP selbst nicht der Anweisung besser als sicher. Es entgeht nicht einmal Übersetzungen. Mein Rat ist, sich nicht die Kernthemen für Best Practices anzuschauen. Schauen Sie sich immer die Datenquelle an und prüfen Sie, ob eine Gefährdung möglich ist.

4
fuxia

Wird versuchen, den Kommentar von swissspidy in eine Antwort zu verwandeln. Kurze Version - es kommt darauf an.

Das Escaping sollte nicht zufällig angewendet werden, da durch das doppelte Escaping eine URL (oder ein beliebiger Inhalt) erzeugt werden kann, die nicht der beabsichtigten URL entspricht. Escaping sollte nur vor der Ausgabe angewendet werden. Daher ist der Kontext wichtiger als die spezifische Funktion, die die URL berechnet.

In Ihrem Beispiel wird im ersten Snippet nur die URL in die Warteschlange gestellt und nicht ausgegeben. Die Verantwortung für das Escapezeichen wird weiter in den WordPress-Stapel an den Code delegiert, der es tatsächlich ausgegeben hat, und das ist der Grund, warum es nicht escapezeichen ist.

Das zweite Snippet erledigt die Ausgabe und aus diesem Grund wird die URL ausgeblendet.

Woher weißt du, wann du nicht fliehen sollst? Hoffentlich wird die Dokumentation von WordPress-APIs irgendwann diese Informationen enthalten, aber folgen Sie vorerst entweder dem vollständigen Codepfad bis zur tatsächlichen Ausgabe oder testen Sie Ihr Thema unter "lustigen" URLs

2
Mark Kaplun

Hier ist unsere Funktion in Frage.

File: wp-includes/theme.php
320: /**
321:  * Retrieve theme directory URI.
322:  *
323:  * @since 1.5.0
324:  *
325:  * @return string Template directory URI.
326:  */
327: function get_template_directory_uri() {
328:    $template = str_replace( '%2F', '/', rawurlencode( get_template() ) );
329:    $theme_root_uri = get_theme_root_uri( $template );
330:    $template_dir_uri = "$theme_root_uri/$template";
331: 
332:    /**
333:     * Filters the current theme directory URI.
334:     *
335:     * @since 1.5.0
336:     *
337:     * @param string $template_dir_uri The URI of the current theme directory.
338:     * @param string $template         Directory name of the current theme.
339:     * @param string $theme_root_uri   The themes root URI.
340:     */
341:    return apply_filters( 'template_directory_uri', $template_dir_uri, $template, $theme_root_uri );
342: }
343: 

Sie schreiben so etwas in Ihr Plugin:

add_filter('template_directory_uri',function(){ return 'http://badserver.com/'; });

Und Sie werden so etwas auf einer Website haben:

 enter image description here 

Bright ist die Zukunft, da ich sehe, dass eine WP_Theme -Klasse den Filter in der WP_Theme::get_template_directory_uri() -Methode nicht implementiert. Wir wissen langsam, dass WordPress immer besser und besser gekapselt wird.

File: wp-includes/class-wp-theme.php
898:    /**
899:     * Returns the URL to the directory of a theme's "template" files.
900:     *
901:     * In the case of a child theme, this is the URL to the directory of the
902:     * parent theme's files.
903:     *
904:     * @since 3.4.0
905:     * @access public
906:     *
907:     * @return string URL to the template directory.
908:     */
909:    public function get_template_directory_uri() {
910:        if ( $this->parent() )
911:            $theme_root_uri = $this->parent()->get_theme_root_uri();
912:        else
913:            $theme_root_uri = $this->get_theme_root_uri();
914: 
915:        return $theme_root_uri . '/' . str_replace( '%2F', '/', rawurlencode( $this->template ) );
916:    }

Weitere Notizen

Du siehst jemanden, der in dem Thema so etwas definiert:

define( 'TEMPL_URI', get_template_directory_uri() );

Sie sagen, es liegt daran, dass sie 'TEMPL_URI' ungefiltert machen möchten. Sie liegen falsch. Wenn ein Plugin einen fehlerhaften Filter gesetzt hat, geschieht dies vor dem Theme, so dass der 'TEMPL_URI' verschmutzt ist.

Es ist jedoch in Ordnung, die Konstanten zu definieren. Ich wollte nur sagen, dass die Konstante Sie nicht schützt.


Eine andere Sache, die ich in Twenty Seventeen gefunden habe. Dort habe ich die Funktion get_theme_file_uri gesehen (@since 4.7)

File: wp-includes/link-template.php
4026: /**
4027:  * Retrieves the URL of a file in the theme.
4028:  *
4029:  * Searches in the stylesheet directory before the template directory so themes
4030:  * which inherit from a parent theme can just override one file.
4031:  *
4032:  * @since 4.7.0
4033:  *
4034:  * @param string $file Optional. File to search for in the stylesheet directory.
4035:  * @return string The URL of the file.
4036:  */
4037: function get_theme_file_uri( $file = '' ) {
4038:   $file = ltrim( $file, '/' );
4039: 
4040:   if ( empty( $file ) ) {
4041:       $url = get_stylesheet_directory_uri();
4042:   } elseif ( file_exists( get_stylesheet_directory() . '/' . $file ) ) {
4043:       $url = get_stylesheet_directory_uri() . '/' . $file;
4044:   } else {
4045:       $url = get_template_directory_uri() . '/' . $file;
4046:   }
4047: 
4048:   /**
4049:    * Filters the URL to a file in the theme.
4050:    *
4051:    * @since 4.7.0
4052:    *
4053:    * @param string $url  The file URL.
4054:    * @param string $file The requested file to search for.
4055:    */
4056:   return apply_filters( 'theme_file_uri', $url, $file );
4057: }

Auch dieser Filter theme_file_uri kann ein Sicherheitsproblem verursachen, wie es @toscho für get_template_directory_uri erklärt hat.

Fazit

Wenn es um die Sicherheit geht, müssen wir sehr vorsichtig sein. Das Problem hier ist tiefer, als nur die einzelne URL zu maskieren. Es berücksichtigt das gesamte Sicherheitsmodell der WordPress-Plugins .

Plugins brauchen nicht die Funktion get_template_directory_uri() und den Filter, um die schlechten Dinge zu tun. Sie können mit den gleichen Berechtigungen wie der WordPress-Kern ausgeführt werden - sie können alles tun.

Durch böswilliges JavaScript, das von ungültigen Plugins injiziert wird, werden Ihre Passwörter möglicherweise während der Eingabe gelesen.

0
prosti