Intereting Posts
массовое обновление мета значения с помощью ajax Как пользоваться английским и американским английским языком? вызов дополнительных ссылок css и js для настраиваемого шаблона страницы Добавить столбец имен файлов в медиа-библиотеку Боковая панель не появляется в нижнем колонтитуле, но она появляется везде! Показывать только контент перед другим тегом Как настроить wp_signon () Возврат категории / название категории из категории ID Пользователям удалось зарегистрироваться на сайте без кнопки регистрации? wp_list_categories в nav_menu Я пытаюсь скрыть пользовательскую категорию типа сообщения для входа в систему с помощью Pre_Get_Posts Создайте регистрацию переднего пользователя / login / profile & logout без вмешательства в wp-login.php? Как регистрировать изображения, загружаемые через FTP в медиа-библиотеку? Создание страницы администрирования WordPress без меню для плагина Возможны пользовательские виджеты боковой панели страницы.

Должно ли escape_template_directory_uri () `сбежать?

Должен ли get_template_directory_uri() сбежать с помощью esc_url() ?

Я спрашиваю, потому что, взяв пример из темы по умолчанию Twenty 15, эта же функция используется в двух разных местах, но только в одном она экранирована.

 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> 

Я бы сказал, что get_template_directory_uri() не нужно создавать, поскольку URL-адрес нельзя манипулировать извне.

Solutions Collecting From Web of "Должно ли escape_template_directory_uri () `сбежать?"

В этой функции мы найдем крючок:

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

Итак, да, URI может быть изменен плагинами, и вы должны избегать его возвращаемого значения.

Тот же принцип применяется ко всем функциям URI WordPress, таким как get_home_url() , get_site_url() и т. Д. Имейте в виду, что есть не только хорошие разработчики плагинов. Некоторые ошибаются, может быть, очень маленькие, которые случаются только в некоторых обстоятельствах.

В случае wp_enqueue_style() WordPress по умолчанию wp_enqueue_style() URL. Но это оболочка для глобального экземпляра WP_Styles , и это, в свою очередь, может быть легко заменено – даже с менее безопасной версией. Это маловероятно, но вы должны знать об этой возможности.

К сожалению, сам WP не следует за лучшей безопасностью, чем жалобой . Он даже не избегает переводов. Мой совет – не смотреть на основные темы для лучших практик. Всегда смотрите на источник данных и посмотрите, может ли он быть скомпрометирован.

Попробуем сделать комментарий швейцарца в ответ. Короткий вариант – это зависит.

Экранирование не следует применять случайным образом, так как двойное экранирование может приводить к URL (или любому типу контента), которые не соответствуют предполагаемому URL-адресу. Экранирование следует применять только перед выходом. Поэтому контекст более важен, чем конкретная функция, которая вычисляет URL.

В вашем примере первый фрагмент просто выдает URL-адрес и не выводит его. Ответственность за экранирование передается дальше в стек wordpress в код, который на самом деле выводит его, и именно по этой причине он не ускользнул.

Второй фрагмент выводит результат, поэтому URL-адрес ускользает.

Итак, как вы знаете, когда вам не следует убегать? Надеемся, что где-то в будущем документация API WordPress будет включать эту информацию, но на данный момент либо следует полный путь кода до фактического вывода, либо тестирует вашу тему под «смешными» URL-адресами

Вот наша функция.

 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: 

Вы пишете что-то вроде этого в своем плагине:

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

И у вас будет что-то подобное на веб-сайте:

введите описание изображения здесь

Яркое будущее, потому что я вижу, что класс WP_Theme не реализует фильтр в WP_Theme::get_template_directory_uri() . Мы знаем, что WordPress становится все лучше и лучше и инкапсулирован.

 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: } 

Другие заметки

Вы видите, что кто-то определяет в теме следующее:

define( 'TEMPL_URI', get_template_directory_uri() );

Они говорят, что это потому, что они хотели бы сделать 'TEMPL_URI' нефильтрованным. Они не правы. Если плагин установил плохой фильтр, это произойдет перед темой, поэтому 'TEMPL_URI' будет грязным.

Тем не менее, это нормально, чтобы определить константы, я просто хотел сказать, что константа не будет защищать вас.


Еще одна вещь, которую я нашел в Twenty Seventeen . Там я увидел функцию get_theme_file_uri (@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: } 

Снова этот фильтр theme_file_uri может наложить проблему безопасности, например @toscho, объясненную для get_template_directory_uri .

Вывод

Когда речь идет о безопасности, мы должны быть очень осторожны. Проблема здесь глубже, чем просто выйти из одного URL-адреса. Он рассматривает всю модель безопасности плагинов WordPress .

get_template_directory_uri() не нужна get_template_directory_uri() и фильтр там, чтобы делать плохие вещи. Они могут выполняться с теми же привилегиями, что и ядро ​​WordPress, – они могут делать что угодно.

Вредоносный код JavaScript, который могут вставлять плохие плагины, может читать ваши пароли во время ввода.