Вопрос или проблема
Недавно я добавил аутентификацию JWT на свой сайт, потому что фронтенд моего сайта полностью отделен от бэкенда.
О чем я не подумал, так это о том, что я мог бы использовать wp_nonce вместо jwt – создавать nonce на бэкенде, хранить его на фронтенде и отправлять с каждым запросом до его истечения.
Какие недостатки имеет метод wp nonce по сравнению с методом jwt?
Кроме того, nonces используются для защиты wordpress от csrf, например.
Есть ли способ защитить rest api от csrf, кроме как правильно установить правила cors (чтобы разрешить только домен фронтенда)?
О чем я не подумал, так это о том, что я мог бы использовать wp_nonce вместо jwt – создавать nonce на бэкенде, хранить его на фронтенде и отправлять с каждым запросом до его истечения.
Какие недостатки имеет метод wp nonce по сравнению с методом jwt?
Использование nonces в качестве замены протокола аутентификации или в качестве идентификатора сессии будет небезопасным. Nonce – это не токен аутентификации или идентификации.
Использовать его как токен аутентификации не получится, или вернее, это будет работать, но безопасность будет крайне низкой.
Цель nonce – доказать, что когда пользователь совершает действие, он намеревался его совершить, что запрос был преднамеренным. Это не является доказательством того, что пользователь – это тот, за кого он себя выдает, и это не предоставляет никаких гарантий в отношении идентичности.
Если они используются в аутентификации, то это как тест для обнаружения повторяющихся атак и избежания повторного отправления записанного запроса на вход атакующим, но они не могут быть использованы для проверки и входа пользователем.
Кратко: это плохая идея, nonces не могут использоваться как средства аутентификации. придерживайтесь известного хорошего метода, который хорошо определен и проверен в боевых условиях, если вы хотите безопасности и надежности.
И не создавайте свою собственную криптографию
Давайте проверим, насколько безопасным будет WP nonce, на момент написания, это реализация, которую использует WP:
function wp_create_nonce( $action = -1 ) {
$user = wp_get_current_user();
$uid = (int) $user->ID;
if ( ! $uid ) {
/** Этот фильтр документирован в wp-includes/pluggable.php */
$uid = apply_filters( 'nonce_user_logged_out', $uid, $action );
}
$token = wp_get_session_token();
$i = wp_nonce_tick();
return substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 );
}
В предложенной схеме это будет упрощено до:
function wp_create_nonce( $action = -1 ) {
$i = wp_nonce_tick();
return substr( wp_hash( $i . '|' . $action . '||', 'nonce' ), -12, 10 );
}
Таким образом, для пользователя нужно знать действие, временную метку nonce и соль, используемую wp_hash
. Мы узнаем действие, временная метка nonce – это простая временная вычисления с некоторым округлением, поэтому нам нужно лишь перебором найти соль.
Мы можем сделать это, изменив wp_create_nonce
для использования версии wp_hash
, которая перебирает все возможные значения для wp_salt
. Это даст нам либо AUTH_SALT
, либо SECURE_AUTH_SALT
в wp-config.php
.
С этого момента начинается цепочка событий, которая позволяет нам выдать себя за любого пользователя на вашем сайте. Смягчение этого включало бы nonce_user_logged_out
и разработку схемы для вставки большего количества данных о сессии пользователя, но это просто задерживает неизбежное.
.
Ответ или решение
Вопрос о сравнении wp_nonce и JWT (JSON Web Token) в контексте аутентификации и защиты веб-приложений с раздельным фронтендом и бэкендом чрезвычайно актуален для современных разработчиков. При выборе между этими двумя механизмами необходимо понимать природу каждого из них и их предназначение.
Теория
WP_NONCE представляет собой уникальную строку, предназначенную для защиты WordPress от атак, таких как CSRF (Cross-Site Request Forgery). Использование nonce позволяет убедиться в том, что действие выполняется намеренно авторизованным пользователем, но не служит подтверждением его подлинности. Nonce не предназначен для аутентификации и идентификации пользователя. Основной целью его использования является предотвращение повторных атак, где злоумышленник может попытаться повторно отправить ранее записанный запрос.
JWT (JSON Web Token), с другой стороны, является полнофункциональным способом аутентификации, который обеспечивает подтверждение личности пользователя. Это компактный, URL-безопасный формат для обмена информацией между сторонами. JWT подписывается с использованием секретного ключа или асимметричного ключа, что делает его более устойчивым к фальсификациям и более надежным в вопросах безопасности и аутентификации. Он также может содержать дополнительные сведения о пользователе или времени истечения срока действия токена, предоставляя более широкие функциональные возможности.
Пример
Рассмотрим пример использования обеих технологий в практическом контексте:
-
WP_NONCE: Представим, что у вас есть форма на сайте, через которую пользователи могут изменять настройки своего профиля. Вместе с этой формой отправляется nonce, который WordPress проверяет при каждом запросе. Это гарантирует, что изменение настроек инициировал именно пользователь, а не злоумышленник, от его имени.
-
JWT: В случае, если ваш сайт работает на децентрализованной архитектуре (разделенный фронтенд и бэкенд), после входа пользователь получает JWT. Этот токен хранится в клиентском приложении и используется для последующих запросов к защищенному API. Токен может содержать закодированную информацию о пользователе и времени истечения, что обеспечивает безопасность и позволяет API эффективно идентифицировать пользователя и его права доступа.
Применение
Теперь давайте углубимся в рассмотрение недостатков использования wp_nonce по сравнению с JWT, а также способы защиты REST API от CSRF-атак.
Недостатки wp_nonce в сравнении с JWT:
-
Слабая аутентификация: как упоминалось ранее, nonce не является методом аутентификации. Он не подтверждает личность пользователя и не подходит для идентификации или управления правами доступа.
-
Ограниченное время жизни и простая структура: WP_NONCE действителен только в течение короткого времени и может быть относительно легко скомпрометирован, особенно если злоумышленник может предсказать nonce или получить доступ к свойствам творения nonce (например, соли или времени).
-
Масштабируемость и безопасность: В случае с JWT, вы получаете аудиторские журналы и возможность работы с ролями в распределенных системах, чего нельзя сказать о WP_NONCE. JWT легко масштабируется и интегрируется с современными системами SSO (Single Sign-On).
Защита REST API от CSRF:
Для защиты вашего REST API от CSRF-атак, кроме настройки CORS (Cross-Origin Resource Sharing) так, чтобы только домен фронтенда имел доступ к бэкенду, могут быть полезны следующие меры:
-
Использование серверных токенов: Помимо CORS, обеспечьте, чтобы все запросы к API требовали специальный серверный токен, который будет известен только авторизованным клиентам.
-
Двойная проверка передачи токена: Проверка токена в заголовке и теле запроса может быть дополнительной мерой безопасности.
-
**Обновление токенов и ог