Rails: как работает csrf_meta_tag? - PullRequest
       14

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

62 голосов
/ 03 апреля 2012

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

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

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

Ответы [ 5 ]

72 голосов
/ 03 апреля 2012

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

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

54 голосов
/ 03 апреля 2012

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

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

С другой стороны, с точки зрения злоумышленника:

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

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

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

14 голосов
/ 03 апреля 2012

В 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 - Перечисление общей слабости

4 голосов
/ 28 января 2013

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

1 голос
/ 14 февраля 2018

Вывод помощника 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);
    },
...