Как токен предотвращает атаку csrf?
Я читал о CSRF и о том, как непредсказуемый шаблон токена синхронизатора используется для его предотвращения. Я не совсем понял, как это работает.
давайте рассмотрим такой сценарий :
пользователь заходит на сайт с такой формой:
<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.
- сделайте вредоносный запрос, используя этот токен.
чего-то не хватает?
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).