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