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

Каждый раз, когда PHP код получает какие-то данные их нужно очищать, потому что передаваемые (входящие) данные как правило могут быть небезопасными. Перед очисткой данные можно проверить на соответствие белому списку, об этом читайте в прошлой главе: проверка данных.

Несколько примеров входящих данных которые нужно проверять и очищать:

  • пользователь отправляет данные в WordPress через форму.
  • данные импортируются из внутреннего или внешнего источника.
  • обрабатывается AJAX запрос.
  • данные поступают в WordPress через всевозможные API.

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

Очистка данных

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

Ниже, список основных функций очистки:

sanitize_email( $email )
Очищает e-mail: убирает недопустимые символы из e-mail адреса.
sanitize_sql_orderby( $orderby )
Проверяет можно ли использовать переданную строку в ORDER BY части SQL запроса.
sanitize_text_field( $text )
Очищает строку передаваемую из поля input (обычно при сохранении в базу данных) или при получении из БД. Удаляет почти все оставляя только текст: без HTML тегов, переносов строк и т.д.
sanitize_textarea_field( $text )
Очищает строку передаваемую из поля textarea (при сохранении в базу данных) или при получении из БД. Удаляет все HTML символы, табуляции, HTML сущности и т.д. Оставляет чистый текст. С версии WP 4.7.
sanitize_html_class( $text )
Подготавливает текст для использования его в html атрибуте class: удаляет все неподходящие символы.
sanitize_title( $title )
Используется для создания ярлыков (slug) записей/рубрик.
sanitize_title_with_dashes( $title )
Очищает заголовок, заменяя пробелы на (-).
sanitize_title_for_query( $title )
Подготавливает строку для использования её в качестве ярлыка (slug) в SQL запросе. Очистка от инъекций делается отдельно. Подразумевается что это название чего-либо: заголовка, имени файла и т.д.
sanitize_user( $username, $strict )
Очищает имя пользователя (логин, username), удаляя небезопасные символы.
$strict = true — значит в именах будут доступны только: [a-zA-Z0-9 _*.-].
sanitize_file_name( $filename )
Очищает название файла, заменяя пробелы на '_' и удаляя недопустимые символы.
sanitize_key( $key )
Очищает строку, чтобы использовать её как ключ. Ключи используются как разные внутренние ID. Оставит только: a-z0-9_-.
sanitize_mime_type( $mime_type )
Очищает строку для использования её как MIME тип. Удаляет все кроме -+*.a-zA-Z0-9/.
sanitize_term_field( $field, $value, $term_id, $taxonomy, $context )
Очищает значение термина (рубрики) для использования в тексте.
sanitize_option( $option, $value )
Очищает значения различных опций, в зависимости от типа опции.
esc_url_raw( $url )
Очищает УРЛ для безопасного использования. В отличии от esc_url(), не очищает для безопасного вывода на экран. Используйте, когда нужно получить НЕкодированный URL, например: в запросах к БД, при редиректах, в HTTP запросах.
wp_filter_post_kses
Очищает контент, оставляя в нем только разрешенные HTML теги и добавляет экранирующие слэши.
wp_filter_nohtml_kses( $text )
Удаляет все HTML теги из переданного текста. Ожидает экранированную строку. Возвращает очищенный текст.

Пример

Допустим, у нас есть input поле title.

<input type="text" name="title">

Получаемые с этого поля данные можно очистить с помощью sanitize_text_field() и сохранить в метаполе записи:

$title = sanitize_text_field( $_POST['title'] );
update_post_meta( $post->ID, 'title', $title );

sanitize_text_field() делает следующее:

  1. Проверяет ошибки в кодировке UTF-8;
  2. Конвертирует одиночный знак < в HTML сущность;
  3. Удалят все теги;
  4. Удаляет переносы строк (\r\n), табуляцию (\t) и невидимые символы пробела;
  5. Удаляет пробелы на концах строки.
  6. Заменяет несколько пробелов на одни.
  7. Удаляет октеты: %[a-f0-9]{2}.

Обязательно ознакомьтесь со статьей: Проверка данных в WordPress.