Я сталкиваюсь с некоторыми проблемами, связанными с токеном аутентификации в Rails, как я уже много раз.
Но я действительно не хочу просто решать эту проблему и продолжать. Я действительно хотел бы понять маркер Подлинности. Ну, мой вопрос: есть ли у вас какой-либо полный источник информации по этому вопросу, или вы бы потратили свое время, чтобы подробно объяснить здесь?
ruby-on-rails
ruby
authenticity-token
Рикардо Акрас
источник
источник
Ответы:
Что просходит
Когда пользователь просматривает форму для создания, обновления или уничтожения ресурса, приложение Rails создает случайное число
authenticity_token
, сохраняет этот токен в сеансе и помещает его в скрытое поле в форме. Когда пользователь отправляет форму, Rails ищетauthenticity_token
, сравнивает ее с той, что хранится в сеансе, и, если они совпадают, запрос может продолжаться.Почему это происходит
Поскольку токен подлинности хранится в сеансе, клиент не может знать его значение. Это не позволяет людям отправлять формы в приложение Rails, не просматривая форму в самом приложении. Представьте, что вы используете сервис A, вы вошли в сервис и все в порядке. Теперь представьте, что вы пошли пользоваться услугой B, увидели понравившуюся вам картинку и нажали на нее, чтобы просмотреть ее в большем размере. Теперь, если какой-то злой код был в службе B, он может отправить запрос в службу A (в которую вы вошли) и попросить удалить вашу учетную запись, отправив запрос на
http://serviceA.com/close_account
. Это то, что известно как CSRF (Подделка межсайтовых запросов) .Если служба A использует маркеры подлинности, этот вектор атаки больше не применяется, поскольку запрос от службы B не будет содержать правильный токен подлинности и не будет допущен к продолжению.
Документация API описывает подробности о метатеге:
Ноты
Имейте в виду, что Rails проверяет только не идемпотентные методы (POST, PUT / PATCH и DELETE). GET-запрос не проверяется на подлинность токена. Почему? поскольку в спецификации HTTP говорится, что запросы GET являются идемпотентными и не должны создавать, изменять или уничтожать ресурсы на сервере, а запрос должен быть идемпотентным (если вы выполняете одну и ту же команду несколько раз, вы должны получать один и тот же результат каждый раз).
Также реальная реализация немного сложнее, как определено в начале, обеспечивая лучшую безопасность. Rails не выдает одинаковый сохраненный токен с каждой формой. Он также не генерирует и не сохраняет новый токен каждый раз. Он генерирует и хранит криптографический хэш в сеансе и выдает новые криптографические токены, которые могут сопоставляться с сохраненным, каждый раз при отображении страницы. Смотрите request_forgery_protection.rb .
занятия
Используйте
authenticity_token
для защиты ваших неидемпотентных методов (POST, PUT / PATCH и DELETE). Также убедитесь, что не разрешены какие-либо запросы GET, которые потенциально могут изменить ресурсы на сервере.РЕДАКТИРОВАТЬ: Проверьте комментарий @erturne относительно GET-запросов, являющихся идемпотентными. Он объясняет это лучше, чем я здесь.
источник
Маркер подлинности разработан таким образом, чтобы вы знали, что ваша форма отправляется с вашего веб-сайта. Он генерируется на машине, на которой он работает, с уникальным идентификатором, который может знать только ваша машина, что помогает предотвратить атаки подделки межсайтовых запросов.
Если у вас просто возникают проблемы с тем, что rails отказывают в доступе к AJAX-скрипту, вы можете использовать
генерировать правильный токен при создании формы.
Вы можете прочитать больше об этом в документации .
источник
Что такое CSRF?
Маркер подлинности является контрмерой подделке межсайтовых запросов (CSRF). Вы спрашиваете, что такое CSRF?
Это способ, которым злоумышленник может перехватить сессии, даже не зная их токены.
Сценарий :
CSRF решение :
источник
Пример минимальной атаки, которая будет предотвращена: CSRF
На моем сайте
evil.com
я убедил вас отправить следующую форму:Если вы вошли в свой банк с помощью файлов cookie сеанса, файлы cookie будут отправлены, и перевод будет осуществлен без вашего ведома.
То есть, когда в игру вступает токен CSRF:
Таким образом, форма в аутентичном браузере будет выглядеть так:
Таким образом, моя атака потерпит неудачу, поскольку она не отправляет
authenticity_token
параметр, и я никак не мог бы угадать его, поскольку это огромное случайное число.Этот метод предотвращения называется шаблоном синхронизатора .
Политика единого происхождения
Но что, если злоумышленник сделал два запроса с JavaScript, один для чтения токена, а второй для передачи?
Одного шаблона токена синхронизатора недостаточно, чтобы предотвратить это!
Именно здесь на помощь приходит единая политика происхождения, как я объяснил по адресу: /security/8264/why-is-the-same-origin-policy-so-important/72569# 72569
Как Rails отправляет токены
Рассмотрено по адресу: Rails: как работает csrf_meta_tag?
В принципе:
Помощники по HTML, такие как
form_tag
добавление скрытого поля в форму для вас, если это не форма GETAJAX обрабатывается автоматически с помощью jquery-ujs , который считывает токен из
meta
элементов, добавленных в ваш заголовокcsrf_meta_tags
(присутствует в шаблоне по умолчанию), и добавляет его к любому выполненному запросу.uJS также пытается обновить токен в формах в устаревших кэшированных фрагментах.
Другие профилактические подходы
X-Requested-With
:Origin
заголовка: /security/91165/why-is-the-synchronizer-token-pattern-preferred-over-the-origin-header-check-toисточник
Маркер подлинности используется для предотвращения атак подделки межсайтовых запросов (CSRF). Чтобы понять маркер подлинности, вы должны сначала понять CSRF-атаки.
CSRF
Предположим, что вы являетесь автором
bank.com
. У вас есть форма на вашем сайте, которая используется для перевода денег на другой счет с запросом GET:Хакер может просто отправить HTTP-запрос на сервер, говоря
GET /transfer?amount=$1000000&account-to=999999
, верно?Неправильно. Атака хакеров не сработает. Сервер будет в принципе думать?
Как сервер знает это? Потому что нет
session_id
cookie, аутентифицирующего запрашивающего.Когда вы входите под своим именем пользователя и паролем, сервер устанавливает
session_id
cookie в вашем браузере. Таким образом, вам не нужно аутентифицировать каждый запрос с вашим именем пользователя и паролем. Когда ваш браузер отправляетsession_id
куки, сервер знает:Хакер может подумать:
В браузере пользователей для
bank.com
домена установлен набор файлов cookie . Каждый раз, когда пользователь отправляет запрос вbank.com
домен, все куки отправляются вместе. Включаяsession_id
печенье.Так что, если хакер может заставить вас сделать запрос GET, который переводит деньги на его счет, он будет успешным. Как он мог обмануть тебя в этом? С подделкой межсайтовых запросов.
Это довольно просто, на самом деле. Хакер может просто заставить вас зайти на его сайт. На своем веб-сайте он может иметь следующий тег изображения:
Когда пользовательский браузер обнаружит этот тег изображения, он отправит запрос GET на этот URL. И поскольку запрос поступает из его браузера, он отправит вместе с ним все файлы cookie, связанные с
bank.com
. Если пользователь недавно выполнил вход вbank.com
...,session_id
файл cookie будет установлен, и сервер подумает, что пользователь хотел перевести 1 000 000 долларов на счет 999999!Этого недостаточно. Что если кто-то разместит это изображение на Facebook, и оно появится на вашей стене? Что если он внедряется в сайт, который вы посещаете с XSS-атакой?
Не правда. Форма, отправляющая запрос POST, может генерироваться динамически. Вот пример из Rails Guide по безопасности :
Токен подлинности
Когда у вас
ApplicationController
есть это:Эта:
Скомпилировано в это:
В частности, генерируется следующее:
Для защиты от CSRF-атак, если Rails не увидит токен аутентификации, отправленный вместе с запросом, он не будет считать запрос безопасным.
Как злоумышленник должен знать, что это за токен? Разное значение генерируется случайным образом каждый раз, когда генерируется форма:
Атака межсайтового скриптинга (XSS) - вот как. Но это другая уязвимость для другого дня.
источник
Это
Authenticity Token
метод 'rails' для предотвращения 'атак подделки межсайтовых запросов (CSRF или XSRF)' .Проще говоря, он гарантирует, что запросы PUT / POST / DELETE (методы, которые могут изменять содержимое) к вашему веб-приложению выполняются из браузера клиента, а не от третьей стороны (злоумышленника), имеющей доступ к созданному файлу cookie. на стороне клиента.
источник
так как
Authenticity Token
это так важно, и в Rails 3.0+ вы можете использоватьсоздавать
где угодно
источник
XSS
на странице входа в систему не для гнусных целей, а для создания нового сеанса с предварительно заполненным именем пользователя. Теперь я знаю, что могу просто использоватьvalue="token_value"
.Остерегайтесь механизма маркера подлинности, который может привести к условиям гонки, если у вас есть несколько одновременных запросов от одного и того же клиента. В этой ситуации ваш сервер может генерировать несколько токенов подлинности, когда их должен быть только один, и клиент, получающий более ранний токен в форме, не выполнит свой следующий запрос, потому что токен cookie сеанса был перезаписан. Есть описание этой проблемы и не совсем тривиальное решение здесь: http://www.paulbutcher.com/2007/05/race-conditions-in-rails-sessions-and-how-to-fix-them/
источник
Методы Где
authenticity_token
требуетсяПочему это требуется
источник
Что такое аутентификационный токен?
Это случайная строка, используемая приложением rails, чтобы убедиться, что пользователь запрашивает или выполняет действие со страницы приложения, а не из другого приложения или сайта.
Зачем нужен аутентификационный токен?
Чтобы защитить ваше приложение или сайт от подделки межсайтовых запросов.
Как добавить маркер аутентификации в форму?
Если вы генерируете форму с помощью тега form_for, автоматически добавляется маркер аутентификации, иначе вы можете использовать
<%= csrf_meta_tag %>
.источник