Що таке одноразові числа (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), функції необхідно передати додаткові параметри.

 

 

 

Сподіваємося, що інформація з даного уроку була для вас корисною!

 



Напишіть тут свою думку/питання

Ваша пошта не публікуватиметься. Обов’язкові поля позначені *