Для чего нужна защита CSRF?

Я слышал о CSRF давным-давно, и то, что я слышу большую часть времени:

Защита от атак CSRF важна, чтобы кто-то не автоматически отправлял вашу форму (используя бот или что-то еще)

Ну, это не 100% правда, не так ли?

Я занимаюсь веб-соскабливанием около 3 лет, и довольно просто сделать запрос, проанализировать поле csrftokenmiddleware и POST его вместе с другими полями.

Итак, для чего это действительно важно?

Ответ 1

Представьте веб-приложение электронного банкинга в banking.example.com со следующей формой для отправки транзакции:

<form action="/transaction" method="post">
    <input type="text" name="beneficiary"/>
    <input type="text" name="amount"/>
    <input type="submit" value="Pay"/>
</form>

Теперь злоумышленник может создать веб-сайт в hacker.net со следующим:

<form action="https://banking.example.com/transaction" method="post" style="visibility:hidden">
    <input type="text" name="beneficiary" value="John Doe, Account No. 34-236326-1"/>
    <input type="text" name="amount" value="1000000"/>
    <input type="submit" value="Pay"/>
</form>
<script>
    document.forms[0].submit();
</script>

Затем злоумышленник обманул бы жертв посещения hacker.net, из-за чего браузеры жертв отправили бы запрос POST в приложение электронного банкинга, сделав большую транзакцию для хакера. Это работает, потому что браузер-жертва с радостью отправляет куки файл сеанса вместе с поддельным POST-запросом в приложение электронного банкинга. Если форма была бы защищена токеном CSRF, злоумышленник не мог заставить браузер-жертву отправлять действительный запрос POST, и, таким образом, атака была бы невозможна.

Этот тип атаки называется атакой на межсайтовый запрос (CSRF).

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

Точки CSRF не защищают веб-форму, автоматически отправляемую обычными авторизованными пользователями как сами. Чтобы защитить от этого, вы должны использовать CAPTCHA.

Ответ 2

Да, вы можете очистить форму и получить токен предотвращения CSRF. Но вы не можете отправить форму без соскабливания сайта, и вы не можете получить токен от кого-то другого, а затем отправить форму - она ​​связана с сеансом. То, что защита CSRF действительно предотвращает, кто-то обманывает пользователя для отправки формы.


Более общее описание CSRF, первоначально опубликованное в ответ на рамки комментариев Django и CSRF:

CSRF - это атака, когда кто-то без разрешения на доступ к ресурсу обманывает кого-то, у кого есть разрешение на доступ к нему.

Итак, например, защита CSRF может помешать кому-то обмануть пользователя, разместив комментарий со спамом или ссылкой на вредоносное ПО. В качестве альтернативы запрос, который они обманывают для пользователя, может быть искажен, сделан для сбоя вашего веб-сервера или включает код, предназначенный для проскальзывания процесса проверки и нанесения ущерба вашей базе данных или компрометации вашего сайта другими способами.

Таким образом, без защиты CSRF кто-то может теоретически обмануть зарегистрированного пользователя, отправив комментарий, который они фактически не пишут.

С защитой CSRF Django обнаружит, что это не реальные данные, представленные через фактическую форму на вашем сайте, и отклонит ее.

Ответ 3

Это защита для другого типа сценария. Иногда злоумышленник может вставлять либо javascript, либо iframes, либо img src-s на вашу страницу в том месте, к которому может войти любой зарегистрированный пользователь. Когда пользователь обращается к странице (скажем, страница с комментариями, а один комментарий запрашивает ссылку от публикации злоумышленников), этот запрос выполняется браузером loggedin, в целом с его файлами cookie. CSRF в основном защищает этот тип инициированных отправлений (простые клиентские сообщения). Конечно, любой злоумышленник может запросить страницу, проанализировать ее для токена и создать запрос с помощью токена, но не может сделать это рядом с зарегистрированным пользователем.

Ответ 4

Вы не сможете

чтобы выполнить запрос, проанализировать поле csrftokenmiddleware и POST его вместе с другими полями.

поскольку JS в другом домене не сможет извлекать и использовать данные из вашего домена для создания запросов, если ваш сервер настроен правильно.

Читайте о CORS.