Сначала краткий обзор XSRF:
- Пользователь переходит на some-attacker.com/evil.html
- evil.html содержит, например, тег
<img>
(или некоторый JavaScript, который отправляет форму POST, ...) с URL "www.your-nice-site.com/doSomeAction"
- Это позволяет браузеру пользователя автоматически отправлять на ваш сайт запрос GET или POST и выполнять действие от имени пользователя. К сожалению, файлы cookie пользователя для www.your-nice-site.com также отправляются автоматически вместе с запросом, поэтому (и вот в чем проблема) , если пользователь вошел в систему, запрос приходит как полностью авторизован пользователем на вашем сервере (то есть, если вашему серверу не требуется дополнительный токен анти-XSRF).
Теперь легко увидеть, что XSRF нельзя использовать для атаки на саму службу входа в систему, потому что в этот момент пользователь еще не авторизован - злоумышленник должен знать учетные данные пользователя для входа в систему. (Если пользователь уже вошел в систему, то вызов службы входа в систему ничего не должен делать! [*])
Примечание. Конечно, злоумышленник может использовать другие методы для атаки на учетные данные пользователя, в частности: фишинг. Анти-XSRF меры не могут защитить вас от этого.
[*] Если у вас есть сервисы, которые нельзя защитить токеном анти-XSRF (например, сервисом входа в систему), то особенно всегда следите за тем, чтобы они не возвращали valid JSON / JavaScript, содержащий какие-либо ценная информация!
Если вам абсолютно необходимо, всегда оберните ответ в комментарии JavaScript (/* */
), как описано в http://code.google.com/webtoolkit/articles/security_for_gwt_applications.html#json. Или даже лучше: добавьте в ответ while(1);
, как объяснено в Почему есть «while (1);» в ответе XmlHttpRequest? . В любом случае, это хорошая практика.