CSRF в WordPress и nonces

Пишу эту статью после вот такого обновления своего плагина для WordPress.

CSRF (Cross-Site Request Forgery) — вид атак, заключающийся в том, что злоумышленник тайно отправляет на атакуемый сайт запрос от лица пользователя.

Атака, например, может быть осуществлена формированием ссылки на атакуемый сайт, при переходе на который от лица пользователя, залогиненного в этом сайте, осуществляется какое-либо действие.

Например, ссылка может выглядеть как-нибудь так:

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

При разработке плагина для WordPress, разумеется, нужно как-то защищаться от подобных атак. Для этого нужно использовать nonces.

Плагин Urvanov Syntax Highlighter активно использует AJAX-запросы. Поэтому нам нужно в самих запросах отправлять дополнительный сгенерированный nonce, чтобы потом его можно было проверить на сервере и сравнить с ожидаемым.

Nonce создаются с помощью wp_create_nonce:

Затем нам нужно передать его на UI. Мы можем, например, добавить его в саму генерируемую страницу:

Но это не самый лучший вариант. Лучше добавить параметры в скрипты с помощью функции wp_localize_script:

В коде выше первым параметром мы передаём имя скрипта (urvanov_syntax_highlighter_js), которое использовали в wp_enqueue_script, вторым параметром передаётся название переменной, которая будет доступна внутри скрипта и будет содержать объект из третьего параметра.

Теперь при отправке AJAX-запросов из скриптов нашего плагина нам нужно в каждый запрос добавлять параметр _ajax_nonce.

Для нашего первого варианта со скрытым полем добавление этого параметра будет выглядеть примерно так:

Для второго варианта с wp_localize_script нам будет доступна переменная urvanovSyntaxHighlighterTagEditorNonces, имя которой мы передали в wp_localize_script вторым параметром:

Осталось добавить проверку этого параметра на самом сервере при обработке нашего AJAX-запроса:

После всего этого желательно проверить, что проверка этого nonce работает. Просто удалите или закомментируйте отправку _ajax_nonce в вашем AJAX-запросе и посмотрите, упадёт ли обработка запроса с ошибкой на check_ajax_referer. Если упадёт, то вы всё сделали правильно, верните отправку _ajax_nonce обратно, проверьте, что запрос выполняется успешно, и можете коммитить.

Один комментарий к “CSRF в WordPress и nonces”

  1. А что мешает злодеям удалить или добавить nonces для своих запросов?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *