"CSRF работает, потому что многие сайты используют GET-запросы для выполнения команд." , поэтому многие сайты не используют метод GET, как ожидалось, поскольку эти запросы должны быть идемпотентными: см. RFC2616 .
"Параметр CSRF уже есть в файле cookie и отправляется вместе с сеансом." , так как же?
Файл cookie используется только для хранения токена, как DOM, когда мы устанавливаем токен в скрытом поле ввода. Часть javascript должна получить значение токена из этого cookie и установить его в качестве параметра в URL, теле запроса или в заголовке запроса. Это будет проверка на сервере со значением, сохраненным в сеансе. Это способ Django для обработки токена CSRF.
Javascript не может получить доступ к cookie из другого домена из-за междоменной защиты браузера, поэтому я не знаю, как злоумышленник может заставить кого-то отправить правильный токен по поддельному запросу. С XSS, да, но XSS побеждает обычные контрмеры CSRF.
Я предпочитаю давать это разъяснение, потому что я думаю, что это важный вопрос, и его не так просто решить.
GET-запрос должен использоваться для получения ресурса и / или отображения его данных, не должен использоваться для изменения его состояния (удаление, увеличение свойства или любые изменения).
Проверка CSRF должна выполняться на стороне сервера, это кажется очевидным, но я поставил это как напоминание. Этот метод не может быть вектором атаки, если вы соблюдаете эти рекомендации.