esc_url в встроенном ACF WordPress

#javascript #php #wordpress #advanced-custom-fields

#javascript #php #wordpress #дополнительно-пользовательские поля

Вопрос:

Я использую плагин ACF WordPress для создания встроенного поля. Поле принимает URL-адрес из Vimeo и выводит iframe во внешнем интерфейсе.

Обычно я избегаю URL-адресов и атрибутов в своей теме следующим образом:

 <a href="<?= esc_url( get_field('link') ); ?>" title="<?= esc_attr( get_field('title') ); ?>">
  

Когда я пытаюсь выйти из oEmbed, ничего не отображается:

 <?= esc_url( get_field('video') ); ?>
  

Если я протестирую XSS с помощью следующего скрипта, поле ACF полностью прерывается с ошибкой JS.

 <script>alert('hello')</script>
  

Нужно ли мне экранировать это поле? Я предполагаю, что WordPress заботится об экранировании через встроенную функцию?

Комментарии:

1. Чтобы уточнить, когда вы удаляете функцию esc_url(), правильно ли выводится URL-адрес?

2. Да, поле выдает iframe и правильно отображает видео.

Ответ №1:

Из официальной документации:

Поле oEmbed вернет строку, содержащую встроенный HTML.

Даже если входные данные имеют тип URL, при получении значения ACF преобразует его в полный HTML-код для встраивания. В заключение, неправильно вызывать esc_url этот HTML, вам просто нужно использовать the_field('video') или echo get_field('video') .

Что касается ACF, принимающего недопустимые (не URL) данные во входных данных типа oEmbed, вы можете написать пользовательский валидатор для выдачи ошибки, если это необходимо, путем реализации фильтра: acf /validate_value .

Ответ №2:

Вы пробовали использовать the_field() вместо get_field()?

 <?= esc_url( the_field('video') ); ?>
  

oEmbed фактически возвращает больше, чем просто URL, так что это тоже может быть проблемой. Я не работал с esc_url() в прошлом, но это может привести к сбоям, потому что все, что передается, — это не только URL.

Как указано здесь, https://www.advancedcustomfields.com/resources/oembed /, «Поле oEmbed вернет строку, содержащую HTML-код для встраивания».

Комментарии:

1. ! Функция the_field повторяет значения, а не возвращает их, так esc_url( the_field('video') ) что это то же самое, что the_field('video'); echo NULL;