разбиране на csrf в django скрито поле във формуляр и CSRFCookie

Записвам разбирането си за механизма csrf protcetion в django. Моля, поправете ме, ако е дефектен.

csrfViewMiddleware създава уникален низ и го съхранява в скрито поле „csrfmiddlewaretoken“ на формуляр, произхождащ от хоста. Тъй като злонамерен уебсайт, имитиращ този формуляр, няма да знае за стойността на това поле, той не може да го използва.

Когато някой се опита да публикува формуляр, уебсайтът проверява полето „csrfmiddlewaretoken“ и неговата стойност. Ако е грешно или не е зададено, тогава се открива опит за csrf.

Но тогава, какво точно е CSRFCookie? Документът казва, че уникалната стойност е зададена в CSRFCookie, а също и в hidden field. Тук съм объркан. Изпраща ли се бисквитка до браузъра с вграден уникален низ? Иска ми се някой да може да обясни това малко по-ясно.

Благодаря ти,


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


Отговори (2)


Добре, ето моето обяснение:

Django присвоява на удостоверен потребител CSRF токен, който се съхранява в бисквитка. Стойността в тази бисквитка се чете всеки път, когато потребител направи заявка, която се счита за „небезопасна“ (а именно POST, PUT, DELETE), за да се потвърди, че потребителят, а не злонамерена трета страна, прави заявката.

CSRF тагът, който поставяте във формуляр, всъщност грабва CSRF токена от бисквитката и след това го предава като POST променлива, когато изпращате формуляр.

Надяваме се, че това го прави малко по-ясно.

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

Със сегашното си разбиране не съм напълно доволен от потвърдения отговор.

Можете да намерите моята версия тук.

За да обобщим, CSRFCookie е „безопасен“ в смисъл, че атакуващият няма достъп до него поради политиката за същия произход. Браузърът ще изпрати тази стойност автоматично. Сега вашият формуляр също трябва да изпраща тази стойност (напр. в скрито поле). Това означава, че вашият формуляр трябва да знае тази стойност и може да я получи от бисквитката.

Нападателят не може да получи токена от бисквитката и следователно не може да фалшифицира злонамерен код, който съдържа токена.

Важното в крайна сметка е, че потребителят може да изпрати csrf токен и че сървърът може да го провери. Използването на бисквитка е удобен начин да направите това, но това може да се реализира по различен начин (например сървърът може да запазва CSRF токените за всяка сесия, например).

Не съм специалист, но така го разбирам. Дано помогне.

person JonasVautherin    schedule 23.05.2014