Функция wp_create_nonce()
генерирует уникальный криптографический токен (nonce), который привязан к конкретному действию, пользователю, сессии и определённому окну времени. Nonce помогает защитить запросы от CSRF-атак (межсайтовая подделка запроса), гарантируя, что запрос был выполнен реальным пользователем, а не сторонним скриптом.
wp_create_nonce( string|int $action = -1 ): string
Параметры
- $action (string|int) (опционально):
Это значение добавляется к контексту создаваемого nonce. Оно определяет, для какого действия создается токен.
По умолчанию:-1
Возвращаемое значение
- string: Возвращает уникальную строку-токен (nonce), связанную с конкретным действием и пользователем.
Описание
Nonce (одноразовый защитный ключ) создается на основе следующих данных:
- Для авторизованных пользователей:
метка_времени | действие | ID пользователя | сессионный токен | wp_salt
- Для неавторизованных пользователей:
метка_времени | действие | wp_salt
Nonce код действителен в течение от 12 до 24 часов и меняется при любом изменении входных параметров (времени, действия, пользователя). Эта функция должна быть вызвана в момент или после срабатывания события init
, иначе могут возникнуть проблемы.
Время жизни Nonce
Время жизни токена можно изменить через фильтр nonce_life
:
$nonce_life = apply_filters( 'nonce_life', DAY_IN_SECONDS );
По умолчанию nonce действует 24 часа. В зависимости от того, попадает ли токен в первую или вторую половину этого времени, функция wp_verify_nonce()
может вернуть 1
или 2
.
Pluggable функция
Функция wp_create_nonce()
является pluggable, что означает возможность её переопределения в плагинах, если это необходимо.
Пример 1: Создание nonce для ссылки
В данном примере мы создаем nonce и добавляем его в URL в качестве GET-параметра. Это используется для защиты действий, выполняемых по ссылке, например, удаления записи.
/*
* Шаг A: Создание nonce для ссылки.
* Мы передаем nonce как GET-параметр.
*/
$nonce = wp_create_nonce( 'my-nonce' );
?>
<a href='myplugin.php?do_something=some_action&_wpnonce=<?php echo esc_attr( $nonce ); ?>'>
<?php esc_html_e( 'Выполнить действие', 'textdomain' ); ?>
</a>
<?php
/*
* Шаг B: Проверка nonce на целевой странице.
*/
$nonce = $_REQUEST['_wpnonce'];
if ( ! wp_verify_nonce( $nonce, 'my-nonce' ) ) {
// Неверный nonce.
die( __( 'Проверка безопасности не пройдена', 'textdomain' ) );
} else {
// Nonce валиден.
// Выполняем действие.
}
?>
Пример 2: Создание nonce для удаления записи
Создаем nonce для удаления конкретной записи, привязывая к нему ID записи:
$post_id = 5; // ID записи
$nonce = wp_create_nonce( 'delete_post-' . $post_id );
?>
<a href='delete.php?post_id=<?php echo $post_id; ?>&_wpnonce=<?php echo esc_attr( $nonce ); ?>'>
<?php esc_html_e( 'Удалить запись', 'textdomain' ); ?>
</a>
<?php
// На целевой странице проверяем nonce
$nonce = $_REQUEST['_wpnonce'];
if ( ! wp_verify_nonce( $nonce, 'delete_post-' . $_REQUEST['post_id'] ) ) {
die( __( 'Проверка не пройдена', 'textdomain' ) );
} else {
// Nonce валиден, продолжаем удаление.
}
?>
Пример 3: Добавление nonce в форму
Для защиты данных формы можно использовать nonce следующим образом:
<form method="post" action="process.php">
<?php wp_nonce_field( 'my_form_action', '_my_nonce' ); ?>
<input type="submit" value="Отправить данные">
</form>
<?php
// В файле process.php проверяем nonce
if ( ! isset( $_POST['_my_nonce'] ) || ! wp_verify_nonce( $_POST['_my_nonce'], 'my_form_action' ) ) {
die( 'Проверка nonce не пройдена!' );
} else {
// Nonce валиден, продолжаем обработку формы.
}
?>
Пример 4: Использование nonce в AJAX-запросах
Для защиты AJAX-запросов можно также использовать nonce:
// В JavaScript передаем nonce в AJAX-запросе
var nonce = '<?php echo wp_create_nonce( "my_ajax_action" ); ?>';
// В обработчике PHP проверяем nonce
function my_ajax_handler() {
check_ajax_referer( 'my_ajax_action', 'security' );
// Nonce валиден, выполняем действия.
wp_send_json_success( array( 'message' => 'Данные успешно обработаны.' ) );
}
add_action( 'wp_ajax_my_action', 'my_ajax_handler' );
Заключение
Функция wp_create_nonce()
является мощным инструментом для защиты действий в WordPress от CSRF-атак. Используйте её в любых случаях, когда требуется подтверждение намерений пользователя, особенно в случаях с важными операциями, такими как удаление данных или выполнение критичных операций.