8. Безопасность и очистка данных
Безопасность в WordPress строится на принципе: никогда не доверять входящим данным и всегда экранировать исходящие.
Validation, Sanitization, Escaping
Заголовок раздела «Validation, Sanitization, Escaping»Существует три уровня обработки данных:
- Validation (Валидация): Проверка, соответствуют ли данные формату (например, является ли строка email-адресом).
- Sanitization (Очистка): Удаление потенциально опасных символов из входящих данных перед сохранением в БД.
- Escaping (Экранирование): Подготовка данных перед выводом в браузер для предотвращения XSS-атак.
Примеры кода
Заголовок раздела «Примеры кода»// 1. Validationif ( ! is_email( $_POST['user_email'] ) ) { wp_die('Неверный формат email');}
// 2. Sanitization (перед сохранением)$user_name = sanitize_text_field( $_POST['user_name'] );$user_bio = wp_kses_post( $_POST['user_bio'] ); // Разрешает только безопасный HTML
// 3. Escaping (при выводе)echo esc_html( $title );echo esc_url( $link );?><input type="text" value="<?php echo esc_attr( $value ); ?>">Nonces (Numbers used once)
Заголовок раздела «Nonces (Numbers used once)»Nonces защищают от CSRF-атак (Cross-Site Request Forgery). Они проверяют, что запрос был отправлен намеренно и из доверенного места.
Жизненный цикл Nonce
Заголовок раздела «Жизненный цикл Nonce»sequenceDiagram participant User participant Server User->>Server: Запрос страницы с формой Server->>Server: Генерация Nonce Server->>User: Страница с формой + hidden nonce field User->>Server: Отправка формы (данные + nonce) Server->>Server: Проверка Nonce (wp_verify_nonce) Note over Server: Если валиден — выполнение действияИспользование Nonce
Заголовок раздела «Использование Nonce»В форме:
<form method="post"> <?php wp_nonce_field( 'yasha_save_settings', 'yasha_settings_nonce' ); ?> <input type="text" name="setting_field"> <input type="submit" value="Сохранить"></form>В обработчике:
if ( isset( $_POST['yasha_settings_nonce'] ) && wp_verify_nonce( $_POST['yasha_settings_nonce'], 'yasha_save_settings' ) ) { // Безопасно сохраняем данные} else { wp_die('Ошибка безопасности');}SQL Инъекции и $wpdb
Заголовок раздела «SQL Инъекции и $wpdb»При выполнении прямых запросов к БД всегда используйте метод prepare().
global $wpdb;$user_id = 5;$results = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}posts WHERE post_author = %d AND post_status = %s", $user_id, 'publish') );- Используйте
sanitize_*функции для входящих данных. - Используйте
esc_*функции для вывода данных. - Всегда добавляйте
nonceв формы и AJAX-запросы. - Никогда не конкатенируйте переменные в SQL-запросах.
Интерактивный пример
Заголовок раздела «Интерактивный пример»Очистка и валидация данных — sanitize vs escape: