Rails: как работает метатег csrf?
Я PHP-разработчик, изучающий Ruby on Rails, читая учебник Майкла Хартла. Вот цитата из книги, относящаяся к csrf_meta_tag:
...метод рельсов
csrf_meta_tag[препятствует] межсайтовых запросов
подделка (CSRF), тип вредоносной веб-атаки. Не беспокойтесь о
детали (я не знаю); просто знаю, что Rails упорно работает, чтобы сохранить ваш
приложение защищено.
дело в том, что мне действительно любопытно. Как вводить csrf-param и csrf-token мета-теги предотвращают CSRF? Я попытался погуглить, но ничего не смог найти.
5 ответов:
csrf_meta_tagв основном выполняет то же самое, что и скрытые поля формы, но есть ли возможность давать запросы javascript, которые не привязаны к форме, простой способ получения маркера.Если вы используете jquery-ujs библиотека содержимое этого мета-тега автоматически добавляется (в качестве заголовка запроса) к любым запросам ajax.
The
csrf_meta_tagвставляет то, что по существу является цифровой подписью на странице, действуя как проверка того, что запросы, поступающие на сервер приложений, на самом деле, от правильно зарегистрированных пользователей. Это помогает предотвратить межсайтовые сценарии (сценарий на совершенно несвязанной странице запускает запросы, чтобы сказать, GMail, пока вы вошли в свой GMail на другой вкладке).Я думаю, чтобы уточнить,
csrf_meta_tagсам по себе не мешает несвязанной странице запускать запросы к вашему GMail (или любой другой сервис, который является целью атаки), но "цифровая подпись" вcsrf_meta_tagиспользуется для проверки достоверности указанных запросов. Недопустимые запросы (т. е. от попыток межсайтового скриптинга) не проходят проверку и поэтому отбрасываются.чтобы сказать это по-другому, с точки зрения атакующего:
до
csrf_meta_tagsсуществовали (они ни в коем случае не являются исключительными для Rails), успешные атаки межсайтовых сценариев позволили вредоносному сайту отправляйте данные в веб-приложение таким образом, чтобы запрос выглядел так, как будто он выполняется от имени пользователя. Итак, предположим, что вы являетесь администратором веб-службы, и на одной вкладке браузера вы вошли в панель администратора для этой службы. Если вредоносный сайт, Открытый на другой вкладке, нацелен на атаку на вашу службу, он может выполнять сценарии, выполняющие запросы администратора, такие как сброс списка пользователей из базы данных, кража других конфиденциальных данных или потенциальный ущерб, или уничтожить данные, содержащиеся в Службе, все время появляясь (с точки зрения сервера), чтобы быть действительными запросами от самого администратора. Элементcsrf_meta_tagЭто способ подписать запросы, и помочь сорвать такие попытки от успеха.есть гораздо более подробное объяснение здесь.
было бы также полезно сделать "источник просмотра" на одной из ваших Rails-генерируемых страниц, и вы увидите, как выглядит тег CSRF.
в 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 Руководство По Безопасности
вот это приятно блог
но-я предпочитаю национальную базу данных уязвимости, вот хорошее объяснение
CWE-352: подделка межсайтового запроса (CSRF)
CWE-79: неправильно Нейтрализация ввода во время генерации веб-страницы ('Межсайтовый скрипт')
проверьте этот документ для перечисления CWE-Common Weakness
csrf_meta_tagsпоказания для ajax-запросов, чтобы использовать их в качестве одного из параметров форму, чтобы сделать запрос к серверу. Rails ожидает, что csrf как часть вашего тела формы (params) будет обрабатывать ваши запросы. Используя эти мета-теги, вы можете построить тело формы или заголовок csrf в соответствии с вашими потребностями. Я надеюсь, что этот ответ поможет вашему вопросу.
вывод помощника csrf_meta_tags:
<meta name="csrf-param" content="authenticity_token" /> <meta name="csrf-token" content="J/gw2ePXHS9Z1SUSSeUQgMmPhsPEFlFbMrLTLFHLfKjeWh7g4uyOnBlfKnlZlmCBiALDWdDWCSo1z0tybGVtfA==" />этот токен может быть включен в запрос ajax. Пример (jquery-ujs):
https://github.com/rails/jquery-ujs/blob/4b6e30f68ff1244fc0c790641d3408c2695a29bd/src/rails.js#L70
csrfToken: function() { return $('meta[name=csrf-token]').attr('content'); }, // URL param that must contain the CSRF token csrfParam: function() { return $('meta[name=csrf-param]').attr('content'); }, // Make sure that every Ajax request sends the CSRF token CSRFProtection: function(xhr) { var token = rails.csrfToken(); if (token) xhr.setRequestHeader('X-CSRF-Token', token); },
Comments