Почему следует использовать esc_url?
Эта вещь усложняет мое кодирование. В документации WordPress расплывчато говорится об использовании esc_url в контексте безопасности. Но действительно ли оно стоит этих усилий?
Например, в чем важное, практическое преимущество безопасности при использовании
<?php echo esc_url( home_url( '/' ) ); ?>
вместо
<?php echo home_url() ?>
PS: Я говорю не о разработке темы, а о конкретном сайте.

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

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

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

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

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

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

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

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