Nonce failure wordpress что это

от admin

Одноразовые числа (nonce)

Во введении упоминалось, что для проверки прав есть два подхода: это «Проверка прав пользователя» и дополняющие эту проверку «Одноразовые числа».

«Одноразовые числа» — это некий токен в WordPress — случайно созданная строка из 10 знаков, например bec698e7ea , которую можно повторить в течении короткого промежутка времени (24 часа). Т.е. создать и проверить это число можно только в течении 24 часа, после этого, та же самая операция вернет уже другое «число».

Такие числа называются в WordPress «Nonce» — «Number used ONCE» (число, использующееся 1 раз) и используются для дополнительной защиты GET и POST запросов. Их можно воспринимайте как секретные приметы, чтобы убедиться, что действие санкционировано.

Подробнее см. описание функции wp_create_nonce()

Пример работы Nonce

Мы зашли в админку, в настройки, при заходе сгенерировалась форма, где одно из полей — это такое «nonce значение». Мы изменили данные и нажали кнопку «сохранить». При обработке данных, кроме проверки прав доступа (current_user_can()) WordPress проверяет сходится ли nonce число. Если nonce не сходится, то запрос на сохранение данных провалится.

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

Зачем нужна проверка «одноразовыми числами»?

Давайте, представим, что неавторизованный пользователь без прав, нашел уязвимое место в плагине. Например, он знает, что есть такая ссылка, нажав на которую администратор, сам не зная того, изменит какую-то настройку (опцию) на сайте, так как нужно хакеру. Например, в настройку запишется хакерский javascript (указанный в ссылке), который затем выполниться при посещении другой страницы сайта этим же администратором.

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

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

Или например, написать письмо администратору сайта, в которое подсунуть внешне безобидную ссылку.

Авторизованный юзер (админ), кликнет по ссылке, и в результате выполниться JS код хакера, который, к примеру, вышлет данные авторизации. И вот, некогда неавторизованный хакер стал администратором вашего сайта.

Чтобы, невозможно было проделать такую хитрость, существуют «одноразовые числа» (nonce защита).

Так как nonce число устаревает, то если добавить это число в URL или в параметр формы и затем проверять его, URL или форма будут рабочими только 24 часа. А затем, запросы создаваемые URL или формой просто не будут проходить проверку. Таким образом, если хакер заставит вас кликнуть по известной ему ссылке, то ссылка скорее всего уже будет нерабочей, потому что не пройдет проверку «одноразового числа».

Nonce Функции

Для управления одноразовыми числами в WordPress есть специальные функции. Основные из них:

wp_nonce_field( $action, $name ) Создает input поле с одноразовым числом для формы. wp_create_nonce( $action ) Просто создает одноразовое число в виде строки. wp_nonce_url( $url, $action ) Добавляет nonce в переданный URL в виде параметра запроса ?_wpnonce=9d6bd884a1 wp_verify_nonce( $nonce, $action ) Проверяет одноразовое число. check_ajax_referer() Проверяет Ajax запрос, на соответствие nonce коду. Обрывает работу скрипта через die, если проверка не пройдена.

Пример использования Nonce защиты

Это пример из раздела проверка прав пользователя, только к нему добавляется еще и nonce проверка.

При создании ссылки, используем wp_create_nonce() , чтобы добавить одноразовое число к ссылке:

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

Затем, при обработке запроса, проверяем одноразовое число:

Проверка referer

Кроме Nonce есть еще проверка referer. Она дополняет nonce защиту. Это независимая проверка и работает она так: из формы передается параметр, где указан HTTP_REFERER , при обработке формы этот параметр проверяется и если запрос пришел не с ожидаемой страницы, то проверка проваливается.

Для referer проверки в WordPress есть 3 функции:

    — создает поле referer — проверяет поле referer — по умолчанию создает еще referer поле для формы, вместе с nonce полем.

Заключение

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

How to Easily Fix the nonce_failure Error in WordPress

While working on your WordPress website, you may sometimes encounter an unexpected “nonce_failure” error message. This error could occur while working in the theme editor or while performing a routine function like deleting a post or comment, etc.

Fortunately, this is one of the common WordPress errors that can be easily fixed. In this post, I will first explain what is WordPress Nonce, why the nonce failure occurs, and how you can fix it quickly.

What is WordPress Nonce?

Simply put, “Nonce” means a number used once. It is a security token used by WordPress to prevent hackers from taking over your site through remote access.

In reality, Nonces are made up of letters and numbers and are appended to URLs like this:

Nonces are generated automatically by WordPress when you perform certain actions in the WordPress backend like deleting a comment or trashing a post.

Although I mentioned the literal meaning of nonce as a number that is to be used only once. But the fact is that nonces are used multiple times within a time frame of 24 hours. That is, nonces have a maximum life span of one day after which they expire and are regenerated.

The time span of nonces can be controlled via the wp-config.php file.

Nonces play a very important authentication role on your WordPress website. If nonces were not used, a hacker could control your website by making your browser send a remote authentication request to WordPress which would be considered valid by it.

Why does the nonce_failure error occur and how to fix it?

The primary reason for the nonce_failure is an authentication error because WordPress failed to authenticate the nonce token. Therefore it displays the nonce_failure message to prevent any remote attack on your website.

Clear your cache

The first thing to do is to clear your site cache since the cache could be sending an expired nonce to WordPress resulting in the nonce_failure error.

Once the cache is cleared, repeat the action (like trashing a post or deleting a comment) that had resulted in the nounce_error. Most probably, the error should be resolved. But if it recurs, then try out the next fix.

Disable the plugins

A plugin could also cause the nounce_failure WordPress error. So, disable all the plugins and reactivate them one by one, each time repeating the action that resulted in the error.

If the error occurs upon activation of a particular plugin, you should update the plugin (if updates are available) or replace it with another plugin. You can also inform the plugin developer about the bug that you discovered.

Set custom cache rules in Cloudflare

If your site is using the Cloudflare service, then setting custom page rules could help. Under the Rules menu in Cloudflare, go to Page Rules.

Then set Cache Level to Bypass for the following two URLs:

Follow the image below for further clarity.

Cloudflare nonce_failure page rule WordPress

Summary

You’ve gone through 3 solutions for the WordPress nonce_failure error. Hopefully, one of these worked for you. If you still experience the error, you can order our affordable WordPress troubleshooting service to fix the error for you.

Одноразовые числа nonces в WordPress и их влияние на безопасность

Внутри ядра WordPress «скрыто» множество полезных инструментов. Один из них — это токены безопасности или «nonces», которые позволяют защититься от некоторых видов неправомерного или злоумышленного использования возможностей сайта.

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

Nonce. Number Used Once

Nonce расшифровывается как «число, используемое один раз» (number used once). Эти числа или «токены» состоят из цифр и букв, являются уникальными для каждого пользователя и для каждого действия, и имеют ограниченное «время жизни», после которого становятся недействительными.

Несмотря на говорящую фразу «число, используемое один раз», в действительности это не совсем так. Nonce генерируется для конкретного пользователя и действия, поэтому будет неизменной до тех пор, пока жизненный цикл не будет закончен (примеры генерации и описание жизненного цикла будут рассмотрены ниже).

Одноразовыми же они называются, потому что предназначены для тех же целей, что и настоящие одноразовые токены. Например, nonce помогают защититься от некоторых типов атак, включая межсайтовую подделку запросов (CSRF), но не защищают от атак повторного воспроизведения (replay atack), потому что nonce не проверяются на использование лишь единожды.

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

Читать:
Винрар как программа 9 букв сканворд

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

Неверное число nonce заставит WordPress выдать в ответ браузеру «403 Forbidden» с сообщением об ошибке «Вы уверены, что хотите сделать это?».

Вы уверены, что вы хотите сделать это?

Вы уверены, что вы хотите сделать это?

Создание чисел nonce

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

Nonce, используемые в AJAX-запросах, обычно добавляются в скрытые поля формы, откуда к ним может получить доступ JavaScript. Стоит заметить, что nonce уникальна для текущей сессии пользователя, поэтому, если входить или выходить асинхронно, nonce на странице станут недействительными.

Генерация nonce

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

Иногда в качестве значений установлена строчка «впишите сюда уникальную фразу». В этом случае необходимо воспользоваться API для создания секретных ключей, заменив подобные значения по умолчанию. После этой процедуры все пароли пользователей останутся действительными, но им прийдется снова выполнить вход.

Где хранятся nonce

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

Nonce в качестве аргумента URL

Для того, чтобы добавить nonce к URL существует функция wp_nonce_url() , которой необходимо передать URL и строчку, обозначающую некое действие. Например:

Для максимальной безопасности, убедитесь, что строка, описывающая действие, названа максимально конкретно. В примере выше название действия будет выглядеть, как trash-post_123 .

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

Числа nonce внутри формы

Для добавления nonce внутрь формы используется функция wp_nonce_field() . В качестве аргумента, как и в случае с добавлением nonce в адрес, необходимо передать строку, которая описывает совершаемое действие.

По умолчанию, функция выведет два скрытых поля. Первое содержит секретное число nonce. Внутри второго поля — текущий URL (referrer). Например:

При таком вызове в форму выведутся следующие скрытые поля:

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

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

Нестандартное использование nonce

Для создания nonce при использовании в других случаях используйте функцию wp_create_nonce() , передав в качестве аргумента строчку, описывающую действие. Например:

После этого, в переменной $nonce окажется уникальный ключ, например, 295a686963 .

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

Проверка действительности чисел nonce

Для всех трех способов внедрения nonce, описанных в предыдущей части, есть функции, с помощью которых можно выполнить проверку действительность токена.

Проверка nonce, полученной с административной страницы

Для проверки nonce, переданной через URL или внутри формы в административной панели WordPress, необходимо использовать функцию check_admin_referer() , передав в качестве аргумента строчку, описывающую название действия.

Функция проверит поля nonce и referrer и если проверка не будет успешной, то произойдет обычное действие — прекращение выполнения кода с ответом 403 и сообщением об ошибке.

Если вы использовали название поля для nonce отличное от того, что задается по умолчанию, необходимо указать его вторым аргументом:

Учтите, что данная функция работает только в рамках административной панели WordPress, и не подойдет для использования в формах, публикуемых на лицевой части сайта. Если требуется проверить действительность кодов nonce на лицевой части, используйте функцию wp_verify_nonce() (см. ниже).

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

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

Функция проверит nonce и в случае, если проверка не будет успешной, завершит исполнение кода. Учтите, что при таком подходе поле referrer не учитывается, но данная функция убедится в том, что запрос действительно пришел по AJAX.

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

Проверка nonce, полученной другими способами

Nonces, полученные другими способами, в том числе и на лицевой части сайта, могут пройти проверку с помощью функции wp_verify_nonce() . Данная функция принимает два аргумента: значение полученного кода nonce и название действия. Например:

В случае отрицательного результата не следует продолжать обработку запроса. Обычно, в таких случаях вызывается wp_nonce_ays() , которая отдает браузеру «403 Forbidden» с сообщением об ошибке.

Изменение системы nonce в WordPress

Систему работы с nonce можно изменять, используя различные события и фильтры. Некоторые функции для работы с nonce размещены в файле pluggable.php , и это означает, что они могут быть легко заменены своими собственными.

Например, для изменения логики проверки АJAX-запросов, необходимо написать свою собственную функцию check_ajax_referrer() в плагине. Список функций и фильтров для работы с nonce можно найти в кодексе.

Изменение продолжительности жизни кодов nonce

По умолчанию, срок действия nonce равен одному дню. После этого число nonce перестает быть действительной, даже если название действия совпадает. Для изменения времени используйте фильтр nonce_life , указав необходимое время в секундах. Например, код ниже устанавливает срок действия на 4 часа:

Обратите внимание, что nonce, как говорилось выше, это не «номер, используемый единожды». Срок действия nonce не совпадает со сроком действия настоящих одноразовых токенов.

Для отсчета срока жизни nonce, WordPress использует систему с двумя «тиками» часов, где 1 тик равносилен половине продолжительности жизни. Во время второго тика nonce может быть обновлена, например, через автосохранение.

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

Nonce, созданная в промежуток с 12:00 до 24:00 будет действительна до 12:00 следующего дня. Фактический срок службы составит значение между 12 и 24 часами. Пример выше, где срок службы устанавливался на 4 часа, означает, что nonce будет действительна от 2 до 4 часов.

Чтобы до конца понять суть взглянем на исходный код функции wp_nonce_tick() , которая возвращает количество 12-и часовых промежутков.

А теперь на функцию wp_verify_nonce() , проверяющую nonce и заодно отсчитывающую количество тиков.

Выполнение дополнительных проверок

Для выполнения дополнительных проверок в момент, когда функция check_admin_referer() установила, что nonce и referrer являются действительными, можно использовать check_admin_referer в качестве события:

Аналогичным способом можно «прицепиться» к событию check_ajax_referer внутри вызова check_ajax_referer() .

Изменение внешнего вида страницы с ошибкой

Внешний вид страницы с сообщением об ошибке, отдаваемой в случае недействительности nonce, можно изменить. Функция wp_nonce_ays() передает необходимое сообщение об ошибке функции с драматичным названием wp_die() . В последней есть несколько фильтров для раздельной обработки AJAX, XML-RPC и всех остальных запросов. Например:

Перехватив фильтр, можно указать собственную функцию, которая сможет отдавать страницу с совершенно другим внешним видом.

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

Если у вас остались вопросы по системе токенов в WordPress, оставьте комментарий и мы обязательно вам ответим.

What a Nonce Error Is & How to Fix It

Anna Fitzgerald

When running a WordPress website, you want to keep it secure so that your forms, content, data, and users are safe from attacks and other malicious activity. One way you can do that is by using nonces.

WordPress site owner fixing a nonce error

Nonces are one-time tokens designed to protect forms and URLs from certain types of misuse, like Cross-Site Request Forgery (CSRF). Basically, a nonce is generated for a given user in a given context so that it’s unique to not only the WordPress install and user, but to the action, the object of the action, and the time of the action.

So let’s say a user opens a post to edit in their WordPress dashboard, then decides to delete it. When submitting the request to delete it, WordPress will verify if a previously generated nonce expected for this exact WordPress install, user, purpose, post, and time period was sent along. It will then decide if the user’s request can be safely processed. If it can’t, then it will return an error message.

This error mechanism is designed to prevent repeated, expired, malicious, or otherwise unwanted submissions and requests from being processed on your WordPress website — but it can also prevent real users from submitting forms or completing other actions on your site.

Похожие статьи