Что такое одноразовые числа (nonces) в WordPress

Что такое одноразовые числа (nonces) в WordPress



Любой уважающий себя движок (CMS) ответственно относится к собственной безопасности. И WordPress здесь не является исключением. Одним из наиболее распространенных методов предотвращения ряда потенциальных угроз безопасности в WordPress является использование nonces (одноразовых чисел, токенов безопасности). У них довольно простая задача: защитить все действия пользователя.

В сегодняшней статье мы детально рассмотрим одноразовые числа в WordPress, а также приведем ряд практических примеров для их применения.

 

 

Знакомство с WordPress nonces

Nonce – это значение хэша, которое состоит из комбинации чисел и букв.

В WordPress nonces определяются как «числа, которые используются один раз». А их целью является защита форм и URL-адресов от определенных типов злонамеренных действий. В практическом плане nonce – это идентификационная единица, которую пользователь должен предъявить, чтобы пройти аутентификацию для выполнения любого действия.

 

Зачем они нужны?

Одноразовые числа безопасности защищают сайты на движке WordPress от вредоносных эксплойтов, которые основаны главным образом на подборе межсайтовых запросов (CSRF – межсайтовая подделка запроса). Этот способ взлома включает в себя передачу неавторизованных команд от пользователя, которому доверяет сайт.

Давайте рассмотрим пример, чтобы лучше понять атаку CSRF. Допустим, есть злонамеренный человек, который хочет заполнить вашу базу данных бесполезными данными, чтобы добиться ее перегруза. Если у вас на сайте есть незащищенная токенами безопасности контактная форма, злоумышленник может написать простой PHP-скрипт, который методом POST будет заполнять форму спамом. И каждый раз, когда пользователь будет нажимать на кнопку формы, в базу данных будет попадать куча спама. Если ваша база данных будет переполнена избыточными объемами данных, это может быстро перегрузить ее и негативно повлиять на производительность всего сайта.



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

Чтобы таких ситуаций не возникало и нужны одноразовые числа безопасности (nonce) в WordPress. Они добавляются к URL-адресу и призваны однозначно идентифицировать пользователя, которому разрешено производить такого рода операции. Например, URL-адрес команды удаления пользователя из базы данных может выглядеть так:

 

https://DOMEN/wp-admin/user.php?userid=1025&action=remove&_wpnonce=as421d9171

 

Поскольку nonce всегда будет разным, практически невозможно угадать его правильное значение.

 

 

Как генерируются nonce и где хранятся

Для процесса генерации одноразовых чисел используются уникальные значения для каждого сайта ключа и соли. Эти значения объявляются в файле wp-config.php в корне сайта WordPress. Значение ключа – это константа NONCE_KEY, а значение соли – это константа NONCE_SALT.

Одноразовые числа не хранятся ни в базе данных, ни в файловой системе. Движок WordPress генерирует nonce заново в момент проверки и сразу сравнивает с полученным.

 

 

Срок жизни для nonce

WordPress nonce имеет ограниченный срок службы, который указывается администратором сайта. Срок действия токена безопасности истекает после завершения срока его жизни, и он не может быть использован для выполнения несвойственных ему действий. По умолчанию значение срока жизни одноразового числа равно 24 часам.

Значение nonce уникально для каждого активного сеанса пользователя. Это означает, что nonce будет уже недействительным, если пользователь вышел из системы, а затем снова вошел в Консоль сайта.

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

Например, если для указанной выше операции удаления пользователя:

https://DOMEN/wp-admin/user.php?userid=1025&action=remove&_wpnonce=as421d9171

злоумышленник заменит ID пользователя на другой (например, userid=1205)

https://DOMEN/wp-admin/user.php?userid=1205&action=remove&_wpnonce=as421d9171

 

эта операция завершится неудачно, поскольку nonce будет недействительным.

В этом случае сайт WordPress в браузере отобразит 403-ю ошибку «Запрещено» и сообщение: «Вы уверены, что хотите это сделать?».

 

 

Практические примеры использования nonce в WordPress

Добавление nonce к URL-адресам

Если вы реализуете некоторые конкретные действия пользователя с помощью URL-адреса, добавление nonce абсолютно необходимо для предотвращения вредоносных атак. Хотя значение nonce будет видимым в ссылке, но, как мы обсуждали выше, одноразовое число будет уникальным для каждой сессии пользователя и будет бесполезным для всех других пользователей.

Чтобы добавить nonce к URL-адресам, мы будем использовать функцию wp_nonce_url(), которой передаются URL-адрес и строка с обозначением действия пользователя в качестве аргументов. Строка должна быть как можно более конкретной, чтобы обеспечить максимальную безопасность. Например, если вы хотите добавить токен безопасности для операции удаления пользователя с вашего сайта, вы можете назвать ее user-deleting.

 

$actionurl = wp_nonce_url( $bare_url, 'user-deleting_' . $user->ID );

 

По умолчанию WordPress называет токен безопасности _wpnonce. Чтобы еще больше повысить безопасность, вы можете использовать следующий вызов функции (добавить третий аргумент), чтобы назначить пользовательскую переменную nonce:

$actionurl = wp_nonce_url( $bare_url, 'user-deleting_' . $user->ID, 'custom_nonce' );

 

Этот код создаст URL-адрес, который может выглядеть примерно так:

https://DOMEN/wp-admin/users.php?user=1025&action=user-deleting&custom_nonce=as421d9171

 

 

Добавление одноразового числа в форму

Если вы добавите одноразовое число безопасности в форму, WordPress автоматически создаст нужные скрытые поля для формы. Для этого нужно вызвать функцию wp_nonce_field() и передать строку, которая обозначает действие пользователя в качестве аргумента. Функция будет генерировать два скрытых поля:

  1. Значение первого поля – одноразовое число безопасности.
  2. Значение второго поля – ссылка на действие.

 

wp_nonce_field( $action, $name, $referer, $echo );

 

Этот вызов функции будет выводить примерно следующее:

<input type="hidden" id="_wpnonce" name="_wpnonce" value="27k912a61c" />
<input type="hidden" name="_wp_http_referer" value="/wp-admin/edit-comments.php" />

 

 

Проверка токенов безопасности (nonce) в WordPress

Важно, чтобы вы определили nonce после создания и добавили их в URL-адреса или формы на своем сайте WordPress. Этот шаг обеспечивает правильную работу функций. Есть четыре способа проверить токены безопасности WordPress, и мы рассмотрим первые три:

  1. Через URL
  2. На странице администрирования (в Консоли)
  3. Полученный через AJAX-запрос токен
  4. В других случаях

 

 

Проверка числа nonce в URL-адресе

Чтобы проверить число nonce, которое было создано, добавлено и передано в URL-адрес, вы можете использовать следующий метод:

wp_verify_nonce($nonce, $action);

 

  • $nonce обозначает название токена, которое вы хотите проверить, например, user-deleting
  • $action обозначает действие пользователя, которое было указано вами при создании nonce

 

Этот вызов функции возвращает значение false, если значение nonce, которое вы пытаетесь проверить, является недопустимым. С другой стороны, если значение nonce верно, оно вернет либо значение 1, либо 2. Значение, равное 1, означает, что одноразовое число было создано 12 часов (или меньше) назад, тогда как 2 означает, что оно было создано более 12 часов, но менее 24 часов назад.

 

 

Проверка одноразового числа в форме

Чтобы проверить одноразовое число, которое был изначально создано и добавлено в скрытое поле формы WordPress, вы можете использовать следующий метод:

check_admin_referer($action, $nonce);

 

  • $action обозначает действие пользователя, указанное вами во время создания nonce
  • $nonce обозначает имя nonce, которое вы хотите проверить, например, delete-comment

 

Если значение токена безопасности действительно, плагин или тема, выполняющие его, будут продолжать выполняться по назначению. Однако, если токен не прошел проверку, то есть он недействителен, пользователь будет перенаправлен на страницу 403-й ошибки «Запрещено».

 

 

Проверка токена, полученного через AJAX-запрос

Если одноразовое число поступило через AJAX-запрос, тогда для его проверки используйте функцию check_ajax_referer(). В качестве аргумента необходимо передать название действия:

check_ajax_referer( 'delete-comment_' . $comment_id );

Функция проверит токен безопасности, и если проверка не будет успешной, код операции не будет выполнен.

Если вы используете не дефолтное название поля для одноразового числа (_wpnonce или _ajax_nonce), функции необходимо передать дополнительные параметры.

 

 

 

Надеемся, что информация из данного урока была вам полезной!

 



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

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