Почему следует использовать esc_url?

12 сент. 2015 г., 22:00:12
Просмотры: 30.3K
Голосов: 20

Эта вещь усложняет мое кодирование. В документации WordPress расплывчато говорится об использовании esc_url в контексте безопасности. Но действительно ли оно стоит этих усилий?

Например, в чем важное, практическое преимущество безопасности при использовании

<?php echo esc_url( home_url( '/' ) ); ?>

вместо

<?php echo home_url() ?>

PS: Я говорю не о разработке темы, а о конкретном сайте.

0
Все ответы на вопрос 4
4
20

Если вы посмотрите документацию по Проверке данных, там говорится следующее о функции:

Всегда используйте esc_url при санитизации URL-адресов (в текстовых узлах, атрибутах или любых других местах). Отклоняет URL-адреса, не имеющие одного из разрешённых протоколов [...], удаляет недопустимые символы и опасные элементы.

Вот вам и практическая польза для безопасности. Корректный протокол, никаких сомнительных символов.

Ответ на вопрос о необходимости однозначно да. Экранирование вывода — это базовая практика безопасности.

12 сент. 2015 г. 23:33:10
Комментарии

При всем уважении, я не вижу, как, например, ссылка на главную страницу может представлять угрозу безопасности. Возможно, эти рекомендации предназначены для создания тем и не применимы к "частному" коду? В конце концов, может быть лучше жестко прописать адрес главной и другие ссылки в html и вообще не использовать php, если есть риски безопасности?

IXN IXN
13 сент. 2015 г. 00:23:39

Гораздо продуктивнее последовательно и повсеместно применять практики безопасности, чем обсуждать, стоит ли это делать в каждом отдельном случае. :)

Rarst Rarst
13 сент. 2015 г. 01:40:34

С другой стороны, ресурс, рекомендованный Codex, устанавливает Правило №3: Доверяйте WordPress. Это, кажется, рекомендует не переусердствовать с санитизацией основных функций WordPress, таких как home_url(), если они используются в правильном контексте. Согласно этой рекомендации, можно было бы ожидать, что home_url выполняет собственную санитизацию.

Franco Franco
11 июн. 2017 г. 12:37:48

Извините, я довольно новичок в этой теме, но может кто-нибудь привести пример, где home_url() или, возможно, get_permalink() (где, насколько я знаю, тоже следует использовать esc_url()) возвращает недопустимый или несанированный (?) URL? Я не хочу быть ленивым или упрямым, поэтому пример может помочь мне понять использование.

SunnyRed SunnyRed
25 июл. 2022 г. 22:01:34
0

Ещё несколько важных моментов, которые нужно помнить о функции esc_url(): она используется для таких случаев, как <a href="ОЧИСТИТЕ_ЭТУ_ССЫЛКУ">ваш_текст</a>. Если вы собираетесь использовать URL в вашем HTML-выводе, например, в атрибуте href для ссылки или атрибуте src для элемента изображения, вам следует использовать esc_url().

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

Функция esc_url_raw() делает практически то же самое, что и esc_url(), но она не декодирует сущности, то есть не заменяет & на &#038 и так далее. Как отметил Марк, безопасно использовать esc_url_raw() в запросах к базе данных, редиректах и HTTP-функциях, таких как `wp_remote_get()' подробнее о esc_url_raw()

13 сент. 2015 г. 00:29:11
2

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

но если бы я мог внедрить этот URL на ваш сайт, я мог бы легко внедрить JS-код, или код перенаправления... или даже серверный код в некоторых ситуациях.

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

Редактирование:

В вашем примере esc_url( home_url( '/' ) );
он работает с полужестко заданным значением! поэтому esc_url можно исключить.
Тем не менее, я все же не вижу смысла различать, когда есть угроза, а когда нет, и в целом рекомендую оставлять esc_url() для всех значений.

13 сент. 2015 г. 10:19:58
Комментарии

"Настройка сайта кем-то, кому вы доверяете" — это всё ещё буквально пользовательский ввод. :)

Rarst Rarst
13 сент. 2015 г. 18:57:21

@Rarst да, я с тобой, но он был так "отвращён" использованием esc_url, что я оказался немного мягче.

Tomer W Tomer W
13 сент. 2015 г. 19:14:00
1

esc_url используется для создания валидного HTML (а не для санации ввода). Эту функцию следует применять всякий раз, когда вы не уверены на 100%, что выводимые данные являются валидным HTML для данного контекста.

12 сент. 2015 г. 22:11:13
Комментарии

Все функции экранирования предназначены явно для санитизации.

Rarst Rarst
12 сент. 2015 г. 23:29:02