Разница между esc_url () и esc_url_raw ()

9

http://core.trac.wordpress.org/browser/trunk/wp-includes/formatting.php#L2239

Я не понимаю, когда следует использовать любой из них.

Предполагая, что у меня есть этот URL:, http://site.com/?getsomejavascript=1который является динамически генерируемым JavaScript:

  • если я включаю сценарий с esc_url(add_query_arg('apples', 420)), я получаю, http://site.com/?getsomejavascript=1&apples=420и он ломается из-за этих #038;ссылок

  • если я использую, esc_url_raw(add_query_arg('apples', 420))я получаю правильный URL:http://site.com/?getsomejavascript=1&apples=420

но в документации я узнаю, что esc_url_raw должен использоваться только для экранирования URL-адресов, вставленных в базу данных ...

onetrickpony
источник

Ответы:

10

Из записи Кодекса для проверки данных: URL :

esc_url( $url, (array) $protocols = null ) (с 2.8)

Всегда используйте esc_url при очистке URL-адресов (в текстовых узлах, узлах атрибутов или где-либо еще). Отклоняет URL-адреса, которые не имеют одного из предоставленных белых списков протоколов (по умолчанию http, https, ftp, ftps, mailto, news, irc, gopher, nntp, feed и telnet), удаляет недопустимые символы и удаляет опасные символы. Устаревший с версии 3.0: clean_url () Эта функция кодирует символы как объекты HTML: используйте его при создании (X) документа HTML или XML. Кодирует амперсанды (&) и одинарные кавычки (') в виде числовых ссылок на сущности (&,').

esc_url_raw( $url, (array) $protocols = null ) (с 2.8)

Для вставки URL в базу данных. Эта функция не кодирует символы как объекты HTML: используйте ее при сохранении URL-адреса или в других случаях, когда вам нужен некодированный URL-адрес. Эта функциональность может быть воспроизведена в старой функции clean_url, установив $ context в db.

Итак, основные отличия выглядят так:

  1. esc_url()кодирует объекты HTML, а esc_url_raw()не
  2. esc_url()предназначен для вывода , а esc_url_raw()для хранения базы данных

РЕДАКТИРОВАТЬ:

Поскольку вы либо жестко программируете (или сохраняете / сохраняете отдельно) фактический URL-адрес из строки запроса, а затем [add_query_arg()][2]добавляете строку запроса через нее, может быть, лучше esc_js()вместо того, чтобы экранировать добавленную строку запроса , а не через esc_url()?

Например:

add_query_arg( esc_js( 'apples' ), esc_js( '420' ), $myurl )
Чип Беннетт
источник
2
хорошо, но esc_url()не работает должным образом, когда у вас есть аргументы запроса в URL, который вы хотите вывести
onetrickpony
Как насчет использования, esc_js()чтобы избежать только данных, добавленных через add_query_arg()? См. Редактирование в ответе выше.
Чип Беннетт
Я не пробовал, но это не имеет смысла :) и esc_js («яблоки») или «яблоки» вернутся apples. Проблема в add_query_arg, когда «яблоки» объединяются с другими аргументами с&
onetrickpony
Тогда, если данные являются доверенными (то есть статическими), зачем вообще избегать?
Чип Беннетт
Я не совсем уверен, что безопасно не избежать этого. Я в основном <script type="text/javascript" src="<?= $_SERVER['REQUEST_URI'] ?>'/?javascriptcode=1"></script>
включаю