Как сделать токен предотвращает атаку csrf?

Я прочитал о CSRF и о том, как использовать для предотвращения этого неактивный шаблон маркера Unpredictable Synchronizer. Я не совсем понял, как это работает.

Возьмем этот сценарий:

Пользователь регистрируется на сайте с этой формой:

<form action="changePassword" method="POST">
   <input type="text" name="password"><br>
   <input type="hidden" name="token" value='asdjkldssdk22332nkadjf' >
</form>

Сервер также сохраняет токен в сеансе. Когда запрос отправляется, он сравнивает токен в данных формы с токеном в сеансе.

Как это предотвращает CSRF, когда хакер может писать код JavaScript, который будет:

  • Отправьте запрос GET на сайт
  • Получить текст html, содержащий форму запроса.
  • Найдите текст html для токена CSRF.
  • Сделать вредоносный запрос с помощью этого токена.

Не хватает чего-то?

+21
09 июл. '15 в 16:36
источник поделиться
2 ответа

Злоумышленник не может использовать JavaScript для чтения маркера с сайта, потому что это будет запрос с перекрестным происхождением, и доступ к данным из него блокируется (по умолчанию) по той же политике происхождения (MDN, W3C).

Возьмите это, например:

var xhr = new XMLHttpRequest();
xhr.open("GET", "http://google.com");
xhr.addEventListener('load', function (ev) {
    console.log(this.responseText);  
});
xhr.send();

Отчеты консоли JS:

XMLHttpRequest не может загрузить http://google.com/. В запрошенном ресурсе присутствует заголовок <Access-Control-Allow-Origin '.

+8
20 июл. '15 в 16:54
источник

Важно понимать, что атаки CSRF происходят только в браузере. Сеанс пользователя с целевым сервером используется вредоносным сервером для подгонки запросов. Итак, как происходит 1-й случай? Два варианта: вы можете сделать запрос № 1 с вредоносного сервера, но это просто вернет токен CSRF для сеанса сервера, или вы можете сделать запроС# 1 с помощью AJAX, который, как вы правильно определили, вернет токен CSRF пользователя жертвы.

Браузеры внедрили контроль доступа HTTP по этой причине. Вы должны использовать заголовок Access-Control-Allow-Origin, чтобы ограничить, какие домены могут делать запросы AJAX на ваш сервер. Другими словами, ваш сервер гарантирует, что браузер не позволит злоумышленнику сделать # 1. К сожалению, документы, которые я прочитал по этому вопросу, не совсем понятны, но я думаю, что, поскольку серверы по умолчанию не отправляют заголовок Access-Control-Allow-Origin, если не настроены на это. Если вам нужно разрешить запросы AJAX, вы должны либо доверять любому происхождению в заголовке, чтобы не выполнять атаку CSRF, вы можете выборочно блокировать уязвимые части вашего приложения, чтобы не разрешать запросы AJAX, или использовать другие заголовки Access-Control-* для защитите себя.

Использование Token Synchronizer - один из способов, которым приложение может полагаться в соответствии с политикой одного и того же происхождения для предотвращения CSRF путем сохранения секретности токен для аутентификации запросов

https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet

Вы должны прочитать Перекрестный ресурс ресурсов (CORS).

-2
09 июл. '15 в 17:35
источник

Посмотрите другие вопросы по меткам или Задайте вопрос