django: csrftoken COOKIE против csrfmiddlewaretoken значение HTML формы - PullRequest
18 голосов
/ 08 апреля 2011

Попытка узнать о безопасности.Любопытно, почему в django при отправке формы (POST) есть 2 отдельных «элемента», которые содержат одинаковое значение токена csrf:

- the csrftoken cookie:
     COOKIES:{'csrftoken': '1effe96056e91a8f58461ad56c0d4ddc', ...

- the Form's hidden csrfmiddlewaretoken:
     POST:<QueryDict: {u'csrfmiddlewaretoken': 
                       [u'1effe96056e91a8f58461ad56c0d4ddc'], ...

Если django вставляет скрытое поле / значение csrf вкогда он отправляет его в браузер (GET) и ожидает того же значения при получении POST, тогда зачем также устанавливать cookie?

Более общий вопрос, если один из них былотсутствует (форма, cookie), не могли бы вы предоставить сценарий, который объясняет, как это может быть использовано (атака безопасности)?

Кстати, я выполнил пару простых тестов, чтобы убедиться, что django проверял правильностькаждого из них в отдельности, и это действительно так:

  • если я изменю значение csrf формы перед выполнением процедуры POST, я получу эту ошибку отладки:

    токен CSRF отсутствует илиневерно

  • если я удаляю файл csrf перед выполнением процедуры POST, я получаю другую ошибку:

    файл CSRF не установлен.

ЯЯ только знаком с основными понятиями csrf и хочу узнать, как django помогает защитить от этих типов атак.

Спасибо,

jd


обновление:

Хотя оба ответа (S.Lott и M. DeSimone) были информативными и имеют смысл, я подумал, что может быть более подробное объяснение необходимости наличия значения безопасности как в форме, так и в файле cookie.При поиске за пределами stackoverflow.com я наткнулся на сообщение в блоге от ... Джеффа Этвуда.

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

Ответы [ 3 ]

19 голосов
/ 12 апреля 2011

Из записи в блоге Джеффа Этвуда:

Предотвращение атак CSRF и XSRF (14 октября 2008 г.)

Оригинальный пост

В статье Фельтена и Зеллера (pdf) рекомендуется cookie-метод для предотвращения XSRF:

Когда пользователь посещает сайт, сайт должен генерировать (криптографически сильное) псевдослучайное значение и установить его как cookie на компьютере пользователя. Сайт должен требовать каждую форму представление, чтобы включить это псевдослучайное значение в качестве значения формы и также в качестве значения cookie. Когда запрос POST отправляется на сайт, запрос должен считаться действительным только в том случае, если значение формы и значение cookie одинаково. Когда злоумышленник отправляет форму на От имени пользователя он может изменять только значения формы. злоумышленник не может прочитать любые данные, отправленные с сервера или изменить cookie значения, в соответствии с политикой того же происхождения. Это означает, что в то время как Злоумышленник может отправить любое значение с формой, он будет невозможно изменить или прочитать значение, сохраненное в куки. Поскольку значение cookie и значение формы должны совпадать, злоумышленник быть не в состоянии успешно отправить форму, если он не может угадать псевдослучайное значение.

Преимущество этого подхода состоит в том, что он не требует состояния сервера; вы просто устанавливаете значение cookie один раз, затем каждый HTTP POST проверяет убедитесь, что одно из представленных значений содержит точное то же значение cookie. Любая разница между двумя означает возможное XSRF атака.

7 голосов
/ 08 апреля 2011

Файл cookie существует для поддержки AJAX. Цитирование Django docs :

Хотя вышеуказанный метод можно использовать для запросов POST AJAX, у него есть некоторые неудобства: вы должны помнить о том, чтобы передавать токен CSRF как данные POST с каждым запросом POST. По этой причине существует альтернативный метод: для каждого XMLHttpRequest установите пользовательский заголовок X-CSRFToken равным значению токена CSRF. Это часто проще, потому что многие фреймворки javascript предоставляют хуки, которые позволяют устанавливать заголовки при каждом запросе. В jQuery вы можете использовать событие ajaxSend следующим образом:

$('html').ajaxSend(function(event, xhr, settings) {
    function getCookie(name) {
        var cookieValue = null;
        if (document.cookie && document.cookie != '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) == (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
    if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
        // Only send the token to relative URLs i.e. locally.
        xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
    }
});

Добавление этого в файл javascript, включенный в ваш сайт, гарантирует, что запросы AJAX POST, сделанные через jQuery, не будут перехвачены защитой CSRF.

6 голосов
/ 08 апреля 2011

Они обнаруживают две разные проблемы.

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

Скрытое поле формы предназначено для аутентификации источника формы.

Пример сценария: Пользователь A на клиентском компьютере может добавить в закладки форму. Пользователь B входит в систему, получает действительный файл cookie с сегодняшнего дня. Пользователь A может отправить недопустимое поле формы со вчерашнего дня, когда в браузере есть оставшийся файл cookie из сеанса пользователя B.


какие ресурсы клиента / браузера обычно скомпрометированы,

Отсутствует.

и как эти поля csrf помогают защитить нас от запросов на подделку?

Жетоны CSRF устанавливают личность.

Один (и только один) браузер имеет маркер cookie CSRF. Но в этом браузере может быть несколько копий открытого сайта или формы закладок.

Одна (и только одна) страница формы в этом браузере имеет маркер формы CSRF.

Браузер и куки-файлы форм должны совпадать, чтобы обеспечить один браузер / одну форму.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...