понимание csrf в скрытом поле django в форме и CSRFCookie

Я записываю свое понимание механизма csrf protcetion в django. Пожалуйста, поправьте меня, если я ошибаюсь.

csrfViewMiddleware создает уникальную строку и сохраняет ее в скрытом поле csrfmiddlewaretoken формы, исходящей от хоста. Поскольку вредоносный веб-сайт, имитирующий эту форму, не знает о значении этого поля, он не может его использовать.

Когда кто-то пытается опубликовать форму, веб-сайт проверяет поле «csrfmiddlewaretoken» и его значение. Если оно неверно или не установлено, то обнаруживается попытка csrf.

Но тогда что такое CSRFCookie? Документ говорит, что установлено уникальное значение в CSRFCookie, а также в hidden field. Вот где я запутался. Отправляется ли файл cookie в браузер с встроенной уникальной строкой? Хотелось бы, чтобы кто-нибудь мог объяснить это немного ясно.

благодарю вас,


person damon    schedule 30.03.2012    source источник


Ответы (2)


Итак, вот мое объяснение:

Django назначает аутентифицированному пользователю токен CSRF, который хранится в файле cookie. Значение в этом файле cookie считывается каждый раз, когда пользователь делает запрос, который считается «небезопасным» (а именно, POST, PUT, DELETE), чтобы подтвердить, что пользователь, а не злонамеренная третья сторона, делает запрос.

Тег CSRF, который вы помещаете в форму, фактически захватывает токен CSRF из файла cookie, а затем передает его как переменную POST при отправке формы.

Надеюсь, это немного прояснит ситуацию.

person Todd    schedule 30.03.2012
comment
Таким образом, этот токен получает только браузер аутентифицированного пользователя, а не каждый, кто посещает сайт. Это правильно? - person damon; 30.03.2012
comment
Не уверен, как именно Django справляется с этим — он может защитить всех пользователей независимо от статуса аутентификации. По сути, любое действие, которое может изменить какой-либо аспект вашего приложения, должно иметь защиту от CSRF. - person Todd; 30.03.2012

С моим нынешним пониманием я не совсем удовлетворен подтвержденным ответом.

Вы можете найти мою версию здесь.

Подводя итог, CSRFCookie является «безопасным» в том смысле, что злоумышленник не может получить к нему доступ из-за политики того же происхождения. Браузер отправит это значение автоматически. Теперь ваша форма также должна отправлять это значение (например, в скрытом поле). Это означает, что ваша форма должна знать это значение и может получить его из файла cookie.

Злоумышленник не может получить токен из файла cookie и, следовательно, не может подделать вредоносный код, содержащий токен.

В конце концов, важно то, что пользователь может отправить токен csrf, а сервер может его проверить. Использование файла cookie является удобным способом сделать это, но это может быть реализовано по-другому (например, сервер может сохранять токены CSRF для каждого сеанса, например).

Я не специалист, но я так понимаю. Надеюсь, поможет.

person JonasVautherin    schedule 23.05.2014