Rails: как работает метатег csrf?



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




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




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

645   5  

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

    Ничего не найдено.