Как сделать токен предотвращает атаку 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.
- Сделать вредоносный запрос с помощью этого токена.
Не хватает чего-то?
Ответы
Ответ 1
Злоумышленник не может использовать JavaScript для чтения маркера с сайта, потому что это будет запрос с перекрестным происхождением, и доступ к данным из него блокируется (по умолчанию) по той же политике происхождения (MDN, W3C).
Возьмите это, например:
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://google.com");
xhr.addEventListener('load', function (ev) {
console.log(this.responseText);
});
xhr.send();
Ответ 2
Важно понимать, что атаки 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).