Написание своего плагина для WordPress. Часть 4. Защита плагина с помощью nonce

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

Необходимость защиты

Для того чтобы осознать необходимость защиты достаточно трезво взглянуть на код функции удаления устаревших редакций из базы данных, который был приведён в 3й части.

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

Защита с помощью nonce

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

Его суть состоит в том, что перед выполнением какого либо действия генерируется некий псевдослучайный идентификатор. Причём генерация выполняется только для данного конкретного пользователя и только в текущем контексте. Также nonce имеют ограниченное «время жизни», по истечении которого они становятся не действительными.

Обычно nonce используются в виде скрытых полей HTML форм или включаются в URL адреса.

Для того чтобы защитить наш плагин с помощью nonce добавим в HTML форму на его странице в админ панели скрытое поле с помощью функции wp_nonce_field.

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

В результате, внутри формы появятся скрытые поля с nonce.

Далее необходимо выполнить проверку nonce в  функции ClearRevisions.

Для примера выполним её наиболее простым и универсальным способом. С помощью функции WordPress wp_verify_nonce (более подробно особенности защиты пользовательского интерфейса работающего в админпанели будут рассмотрены ниже). Для этого необходимо предварительно подключить файл pluggable.php из директории wp-includes.

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

Защита URL строится во многом аналогичным образом. Отличие только в том, что nonse включается не в HTML форму, а в URL страницы при помощи функции wp_nonce_url.

Эта функция принимает три параметра: исходный URL, название действия, имя самого nonce. А, возвращает URL, который содержит в себе параметр nonce.

Особенности защиты страницы плагина в админпанели

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

  1. Универсальный. С использованием функции wp_verify_nonce (пример был приведён выше);
  2. Специализированный. Предназначенный только для nonce созданных в админпаненли с использованием функции check_admin_referer (также расположена в файле pluggable.php).

Отличие между ними в том, что функция check_admin_referer дополнительно проверяет ещё и HTTP referer. Это предотвращает передачу даже корректного nonce со страницы, которая не относится к админпанели WordPress. Тем самым обеспечивается более высокий уровень безопасности.

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

Кроме того при его использовании значительно сокращается объём кода. Если проверка nonce завершится неудачей, функция check_admin_referer сама выдаст сообщение об ошибке.

Перепишем приведённый выше пример с применением второго способа.

Функция check_admin_referer принимает два параметра: название действия и имя nonce (если используется стандартное имя параметр не обязателен).

Теперь защита плагина стала гораздо надёжнее.

Особенности защиты страниц использующих AJAX

Для проверки nonce полученных с помощью AJAX используется специальная функция check_ajax_referer (также расположена в файле pluggable.php). Она принимает те же параметра, что и check_admin_referer полюс третий параметр die.

Этот параметр определяет будет ли завершаться выполнение кода с выдачей сообщения об ошибке в случае неудачной проверки nonce. Этот параметр имеет значение по умолчанию (true) и не является обязательным.

Несмотря на своё название, эта функция проверяет только сам nonce.

Репозиторий WordPress

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

Ссылки

  1. WordPress Nonces

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

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