Функция sanitize_post()
в WordPress очищает каждое поле переданного поста, выполняя его фильтрацию и предотвращая попадание опасных данных. Эта функция помогает избежать уязвимостей, связанных с выводом данных, обеспечивая корректное отображение и защиту полей поста.
sanitize_post( object|WP_Post|array $post, string $context = 'display' ): object|WP_Post|array
Параметры функции
- $post (object | WP_Post | array) — объект или массив данных поста, требующий очистки.
- $context (string) — тип фильтрации данных. Может принимать следующие значения:
- ‘raw’ — минимальная очистка, обрабатываются только числовые поля (
ID
,post_parent
,menu_order
,ancestors
). - ‘edit’ — фильтрация для данных, подлежащих редактированию.
- ‘db’ — фильтрация для сохранения в базе данных, избегая экранирования символов.
- ‘display’ — очистка для безопасного отображения данных на экране.
- ‘attribute’ — фильтрация для использования в атрибутах HTML.
- ‘js’ — очистка для использования в JavaScript.
- ‘raw’ — минимальная очистка, обрабатываются только числовые поля (
Возвращаемое значение
Функция возвращает очищенные данные в том же формате, что и переданный аргумент $post
: объект, WP_Post
или массив.
Пример 1: Очистка данных для отображения на экране
Получим данные поста из $_POST
и выведем на экран, предварительно очистив их для безопасного отображения.
$post_data = $_POST['post_data'];
$post_data = sanitize_post($post_data);
// Выводим очищенные данные
foreach ($post_data as $key => $value) {
echo "$key = (" . gettype($value) . ") " . htmlspecialchars($value) . "\n";
}
Пример 2: Очистка перед записью в базу данных
При добавлении новой записи в базу данных важно, чтобы все поля поста были предварительно очищены.
$postarr = $_POST['post_data'];
unset($postarr['filter']); // Удаляем данные о предыдущей очистке
// Очищаем данные для использования в SQL-запросе
$postarr = sanitize_post($postarr, 'db');
// Подготавливаем данные к записи в базу данных
$data = wp_unslash($postarr);
$wpdb->insert($wpdb->posts, $data);
Пример 3: Сравнение очистки с разными типами контекста
Допустим, у нас есть массив $post_data
с данными поста:
$post_data = array(
'ID' => '834',
'post_author' => '3',
'post_date' => '2024-10-15 10:45:00',
'post_content' => 'Пример контента <script>alert("тест");</script>',
'post_title' => 'sanitize_post пример',
'post_status' => 'publish',
'comment_status' => 'closed',
'post_name' => 'sanitize_post-example',
'post_parent' => '0',
'menu_order' => '5',
);
Применим разные типы очистки к этим данным и посмотрим результаты.
1. Очистка с context = 'raw'
$post_data = sanitize_post($post_data, 'raw');
В результате ID
, post_parent
и menu_order
будут приведены к числовому типу, остальные данные останутся в исходном виде.
2. Очистка с context = 'edit'
$post_data = sanitize_post($post_data, 'edit');
В контексте edit
данные поста очищаются для безопасного редактирования, включая ограничение контента доступными тегами.
3. Очистка с context = 'db'
$post_data = sanitize_post($post_data, 'db');
Этот режим используется перед записью в базу данных, однако не включает экранирование символов.
4. Очистка с context = 'display'
$post_data = sanitize_post($post_data, 'display');
Очистка для отображения на экране, включает фильтрацию HTML, оставляя безопасные для отображения элементы.
5. Очистка с context = 'attribute'
$post_data = sanitize_post($post_data, 'attribute');
Все специальные символы, например кавычки, преобразуются в соответствующие HTML-сущности, что предотвращает инъекции в атрибуты HTML.
Заключение
Функция sanitize_post()
является мощным инструментом для очистки данных в WordPress, обеспечивая их защиту и корректное отображение.