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

Опубликовано 14 августа 2022 в 00:16 (Обновлено 9 января 2024 в 14:12)

Время чтения: 5 мин

Рассмотрим что такое одноразовые числа Nonces, их использование в WordPress и цель применения.

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

В чем суть?

Когда вы входите в WordPress, вам назначается куки-файл (cookie), - маленький файл, который живет в вашем браузере и действует как ваш "закулисный пропуск" в админ панель WordPress.

Это предотвращает несанкционированный доступ неавторизованных лиц к административной панели и совершение плохих поступков. У них нет куки, поэтому они останавливаются у двери "вышибалой".

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

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

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

Ну, если неавторизованное лицо отправит форму или нажмет на ссылку, ничего не произойдет. Они получают отказ браузера, потому что у них нет куки-файла для входа в систему. Но что, если вас обманули с этой ссылкой?

"Вышибала" впускает вас, и действие выполняется. У вас есть разрешение, но у вас не было намерения. Вы не хотели нажимать на ссылку, которая бы удалила сообщение. Вас обманули! Чтобы защитить себя от этого, WordPress должен убедиться, что вы намерены делать то, что делаете.

HTTP_REFERER - это старый способ

В прошлом WordPress делал следующее: он проверял, что страница, которую вы просматривали до начала действия, была страницей администратора WordPress.

То есть вы уже были внутри … ссылка или форма, по которой вы щелкнули, не были вредоносными; это было частью администратора WordPress. WordPress сделал это, проверив значение HTTP_REFERER, которое отправил ваш браузер.

Недостатки HTTP_REFERER

У HTTP_REFERER есть проблемы. Во-первых, его можно подделать с помощью JavaScript в каком-нибудь популярном браузере. Во-вторых, некоторые брандмауэры или прокси удаляют эту информацию. Подмена означает, что это не безопасно.

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

Я разместил это сообщение в списке WP-Hackers, после чего последовала большая дискуссия. Я предложил альтернативный метод проверки намерений и начиная с WordPress 2.0.3, эта система была реализована.

Nonces - это путь вперед

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

Думайте о nonces как о пароле, который меняется каждый раз, когда он используется. Реализация WordPress технически не является одноразовой, потому что электронный ключ меняется только каждые 12 часов и действует в течение 24 часов (то есть действительный ключ и предпоследний ключ действительны), но это достаточно близко.

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

Они уникальны для установки WordPress, для пользователя WordPress, для действия, для объекта действия и для времени действия (24 часа). Это означает, что если что-то из этого изменится, одноразовое число будет недействительным.

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

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

Nonces: используйте их в своих плагинах

Авторы плагинов, слушайте. Для предотвращения обратной совместимости при появлении диалогового окна «Вы уверены?», когда пользователи, не зависящие от HTTP_REFERER, взаимодействуют с вашими плагинами (особенно страницами опций), вам нужно добавить nonce-возможности в ваши плагины. Но не волнуйтесь - это легко.

Защита <form> через nonce

Чтобы защитить <form> с помощью одноразового числа, просто используйте функцию wp_nonce_field() внутри (я бы сделал это сразу после открывающего тега). Для обратной совместимости используйте function_exists() для условного выполнения кода.

Строка, которую вы передаете функции, должна быть уникальной для вашего плагина. Используйте следующую договоренность: plugin-name-action_object.

Итак, если мой плагин называется «cool plugin» и действие, которое выполняет форма - «update options», а объект - «advanced options», я бы сделал: cool-plugin-update-options_advanced.

Часть «объект» не требуется, но если у вас есть несколько форм, защитите каждую с помощью другого объекта для обеспечения наивысшего уровня защиты.

<form ...>
<?php
if ( function_exists('wp_nonce_field') ) 
	wp_nonce_field('plugin-name-action_' . $your_object); 
?>

Защите ссылок с помощью nonce

Если вы выполняете действия, основанные на кликах по ссылкам, вы можете добавить одноразовые числа (nonces) в свои ссылки с помощью wp_nonce_url(), который принимает два параметра.

Первый - это URL-адрес ссылки, второй - ваш одноразовый ключ. Обратите внимание на использование function_exists() для обратной совместимости:

<?php
$link = 'your-url.php';
$link = ( function_exists('wp_nonce_url') ) ? wp_nonce_url($link, 'plugin-name-action_' . $your_object) : $link;
?>

<a href="<?php echo $link; ?>">link</a>

Верификация nonces

На сервере перед выполнением действия, защищенного одноразовым числом, просто вызовите это:

<?php check_admin_referer('plugin-name-action_' . $your_object); ?>

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

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

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