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

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

давайте рассмотрим такой сценарий :

пользователь заходит на сайт с такой формой:

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

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

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

  1. отправить запрос GET на сайт
  2. получить HTML-текст, содержащий форму запроса.
  3. Поиск HTML-текста для токена CSRF.
  4. сделайте вредоносный запрос, используя этот токен.

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

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/. Нет!--2-->' заголовок присутствует на запрошенном ресурс.


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

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

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

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

вы должны прочитать о Совместное Использование Ресурсов Cross-Origin (CORS).