Принципы безопасности ACF

Введение

Advanced Custom Fields — это плагин для WordPress, который позволяет легко хранить произвольные данные, связанные с типами данных WordPress, например записями, страницами, пользователями, таксономиями и т. д.

Эти дополнительные данные хранятся в базе данных либо в связанных таблицах метаданных, либо в таблице параметров WordPress — в зависимости от места отображения группы полей ACF.

ACF использует базовые функции WordPress для чтения и записи данных в таблицы базы данных, поэтому напрямую наследует многие механизмы безопасности и совместимости ядра WordPress.

Вопросы безопасности

По умолчанию данные, хранящиеся в ACF, не видны публично. Исключением является случай, когда группа полей или отдельные поля становятся доступными через REST API.

Шорткод ACF исторически предоставлял доступ к значениям любых полей ACF в любом месте. Это означало, что любой пользователь с правом публикации записей на сайте мог получить доступ к любому полю, если ему было известно его имя. В ACF 6.3.0 шорткод ACF был отключён по умолчанию для новых установок ACF. В ACF 6.3.4 доступ также был ограничен, чтобы пользователи не могли получать значения полей ACF в непубличных записях.

В версии ACF 6.3.6 была представлена новая модель безопасности для доступа к полям. Доступ редакторов к полям через шорткод ACF или привязки блоков управляется новым переключателем на вкладке «Представление» каждого поля. Для всех полей, созданных до версии 6.3.6, это значение установлено в true, чтобы сохранить прежнее поведение, однако для новых полей, созданных после выхода ACF 6.3.6, оно будет установлено в false.

Если пользователь пытается получить доступ к полю, для которого не включён параметр «Разрешить доступ к значению в интерфейсе редактора», результат будет пустым. При этом во время предварительного просмотра записи будет показано сообщение об ошибке с объяснением, почему значение не отображается.

Мы рекомендуем отключать доступ к полям через интерфейс редактора для всех полей, если только редакторам контента действительно не требуется получать их значения через шорткод ACF или привязки блоков. Это особенно важно, если поле содержит защищённую информацию, например ключи доступа или другие секретные данные.

Установка

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

Особых требований безопасности к установке нет: следует применять стандартные правила и разрешения WordPress для плагинов. Пользователям, устанавливающим ACF впервые, следует выполнить действия, описанные здесь.

Крайне важно обеспечить доступ к обновлениям безопасности. ACF внедрил альтернативный механизм обновления, описанный здесь. Этот процесс следует выполнить для каждого сайта WordPress, на котором установлена бесплатная версия ACF. После этого обновления плагина должны стать доступны в панели администратора WordPress обычным образом.

Безопасный вывод данных ACF

ACF пытается использовать возможность unfiltered_html, чтобы только администраторы могли сохранять потенциально небезопасный HTML. Однако пользователи с ролью автора и выше могут обойти эту защиту, используя другие предоставляемые WordPress способы обновления метаданных записи. Поэтому очень важно экранировать значения полей и при их выводе.

Многие пользователи применяют ACF для хранения потенциально небезопасного HTML, например iframe или тегов script, поэтому по умолчанию ACF не выполняет экранирование при использовании get_field(). Поэтому при использовании get_field или get_sub_field пользователи должны экранировать поля при выводе в шаблоне или теме.

Для этого мы предоставляем функцию acf_esc_html. Ей необходимо передать строку, которая будет обработана системой WordPress kses. В качестве альтернативы можно напрямую использовать любую другую функцию экранирования, например wp_kses_post или wp_kses, либо другие средства экранирования PHP.

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

$link = ‘<a href=”’ . esc_url( get_field( ‘your_link_url_field’ ) ); . ‘“>link text</a>` 

До выхода ACF 6.2.7 функции the_field и the_sub_field также не выполняли экранирование, однако у пользователей не было возможности экранировать значения при использовании этих функций. Начиная с ACF 6.2.7, эти функции автоматически выполняют экранирование с помощью acf_esc_html.

Начиная с ACF 6.2.5, вывод шорткода ACF также по умолчанию экранируется.

Обновлено: 30.09.2026