CSRF атака работи на незащитен сайт, в който потребителят е влязъл. Помислете за сайт S, който използва бисквитка за сесия C (и нищо друго), за да идентифицира сесията на потребителя. Това означава, че браузърът ще изпрати C при всяка заявка до S. Тъй като наличието на сесийната бисквитка е всичко, което е необходимо за потвърждаване на сесия, потребителят ще бъде влязъл, когато получи достъп до S. Това е страхотно. Точно това, което искаме.
С изключение...
Да приемем, че S can е уебсайт, който може да изпраща пари в брой чрез URL като https://S/email-cash?email=recipient@examplecom
. Зъл уебсайт E може да е вградил връзката https://S/email-cash?email=ATTACKER@examplecom
в една от страниците си. Сега, когато потребителят разглежда сайт E, докато е влязъл в сайт S и щракне върху тази връзка, в крайна сметка ще изпрати пари на нападателя по имейл. Дори по-лошо, тази връзка може да бъде изпълнена в JavaScript зад кулисите, така че потребителят трябва само да посети сайт E. Много лошо.
Проблемът възниква, защото всяка заявка, придружена от валидна бисквитка C за идентификатор на сесия, се третира като валидна заявка. Решението е да се изиска от браузъра да изпрати част от идентификатора, който е могъл да получи съвсем наскоро от сайт S. Това е CSRF токенът. Няма начин браузърът да го получи, освен ако не му е дадено от S и S ще го даде само когато обслужва страница, а не за атака между сайтове.
Сега, ако започнете да съхранявате CSRF токена като постоянна бисквитка, това проваля цялата цел, защото става нещо, което браузърът може да изпрати при атака между сайтове.
person
Neil Smithline
schedule
05.06.2015