Rails: Как работает csrf_meta_tag?

Я разработчик PHP, изучающий Ruby on Rails, прочитав учебник Майкла Хартла. Вот цитата из книги, относящаяся к "csrf_meta_tag":

... метод Rails csrf_meta_tag [предотвращает] межсайтовый запрос подделка (CSRF), тип злонамеренной веб-атаки. Не беспокойтесь о подробности (я не знаю); просто знаю, что Rails упорно работает, чтобы сохранить ваши приложение безопасно.

Дело в том, что мне действительно любопытно. Как вставка мета-тегов "csrf-param" и "csrf-token" предотвращает CSRF? Я попробовал Googling, но ничего не мог найти.

Ответ 1

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

Если вы используете библиотеку jquery-ujs, содержимое этого метатега автоматически добавляется (как заголовок запроса) к любым запросам ajax, сделанным.

Ответ 2

csrf_meta_tag вставляет, по сути, цифровую подпись на страницу, действуя как подтверждение, что запросы, поступающие на сервер приложений, фактически являются должным образом зарегистрированными пользователями. Это помогает предотвратить межсайтовый скриптинг (a script на полностью несвязанных запросах на запуск страницы, чтобы сказать, GMail, пока вы вошли в свой GMail на другой вкладке).

Я предполагаю, что уточнить, сам csrf_meta_tag не мешает нежелательной странице отсылать запросы на ваш GMail (или любую другую услугу, которая является целью атаки), но "цифровая подпись" в csrf_meta_tag используется для проверки действительности указанных запросов. Неверные запросы (т.е. От попыток сценариев межсайтового сценария) должны выходить за пределы проверки и поэтому отбрасываются.

Говорить об этом по-другому, с точки зрения злоумышленника:

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

Здесь доступно гораздо более подробное объяснение .

Было бы также учебным, чтобы создать "источник просмотра" на одной из ваших страниц, созданных Rails, и вы увидите, как выглядит тег CSRF.

Ответ 3

В Rails он будет работать следующим образом

def csrf_meta_tags
    if protect_against_forgery?
      [
        tag('meta', :name => 'csrf-param', :content => request_forgery_protection_token),
        tag('meta', :name => 'csrf-token', :content => form_authenticity_token)
      ].join("\n").html_safe
    end
  end

Подробнее см..

Вам также необходимо проверить Руководство по безопасности Ruby On Rails

вот хороший blog

НО - я предпочитаю Национальную базу данных уязвимостей, вот хорошее объяснение

CWE-352: Подпрограмма запроса на межсайтовый запрос (CSRF)

CWE-79: Неправильная нейтрализация ввода во время создания веб-страниц ( "Скрипты между сайтами" )

Проверьте этот документ для CWE - Общее перечисление слабых сторон

Ответ 4

csrf_meta_tags являются указаниями для ajax-запросов использовать их в качестве одного из параметров формы для запроса на сервер. Rails ожидает, что csrf будет частью вашего тела формы (params) для обработки ваших запросов. Используя эти метатеги, вы можете построить тело формы или заголовок csrf в соответствии с вашими потребностями. Надеюсь, этот ответ поможет вашему вопросу.