Что такое токен CSRF? Каково его значение и как оно работает?

271

Хорошо, ребята, я пишу приложение Django, и мне просто нужно понять, что на самом деле означает токен csrf и как он защищает данные. Являются ли почтовые данные небезопасными, если вы не используете токены csrf?

Я знаю, как использовать csrf_token, но мне просто нужна информация о том, как это работает.

  • 10
    Это секретный, специфичный для пользователя токен во всех отправляемых формах и URL-адресах с побочными эффектами для предотвращения подделок межсайтовых запросов. Более подробная информация здесь: en.wikipedia.org/wiki/Cross-site_request_forgery
  • 1
    Похоже, что есть тонкая грань между защитой вопроса и запретом его из-за слишком широкой: D
Показать ещё 1 комментарий
Теги:
csrf

4 ответа

794

Подпрограмма запроса на межсайтовый запрос (CSRF) простыми словами

  • Предположим, что вы в настоящее время зарегистрированы в онлайн-банке в www.mybank.com
  • Предположим, что денежный перевод из mybank.com приведет к запросу (концептуально) формы http://www.mybank.com/transfer?to=<SomeAccountnumber>;amount=<SomeAmount>. (Номер вашей учетной записи не нужен, потому что это подразумевается вашим логином.)
  • Вы посещаете www.cute-cat-pictures.org, не зная, что это вредоносный сайт.
  • Если владелец этого сайта знает форму вышеуказанного запроса (легко!) и правильно догадывается, что вы вошли в mybank.com (требуется некоторая удача!), они могут включить на свою страницу запрос типа http://www.mybank.com/transfer?to=123456;amount=10000 ( где 123456 - номер их счета в Каймановых островах, а 10000 - это сумма, которую вы считали ранее своей радостью).
  • Вы получили эту страницу www.cute-cat-pictures.org, чтобы ваш браузер выполнил этот запрос.
  • Ваш банк не может распознать это происхождение запроса: ваш веб-браузер отправит запрос вместе с вашим cookie www.mybank.com, и он будет выглядеть совершенно законным. Там идут ваши деньги!

Это мир без токенов CSRF.

Теперь для лучшего с токенами CSRF:

  • Запрос на передачу расширен третьим аргументом: http://www.mybank.com/transfer?to=123456;amount=10000;token=31415926535897932384626433832795028841971.
  • Этот токен - это огромное, невозможное догадываться случайное число, которое mybank.com будет включать в себя на своей веб-странице, когда оно будет служить вам. Он отличается каждый раз, когда он обслуживает любую страницу.
  • Злоумышленник не может угадать токен, не может убедить ваш веб-браузер сдаться (если браузер работает правильно...), и поэтому злоумышленник не сможет создать действительный запрос, потому что запросы с неправильным токеном (или без токена) будут отклоняться www.mybank.com.

Результат: вы сохраняете свои денежные единицы 10000. Я предлагаю вам пожертвовать часть этого в Википедию.

(Ваш пробег может отличаться.)

  • 19
    И очевидно, что токен в идеале должен называться токеном анти- CSRF, но название, вероятно, достаточно сложное, как оно есть.
  • 3
    @LutzPrechelt спасибо. почему javascript не может получить токены подлинности из браузера?
Показать ещё 17 комментариев
204

Да, данные сообщения безопасны. Но происхождение этих данных не является. Таким образом, кто-то может обмануть пользователя с помощью JS для входа на ваш сайт, просматривая веб-страницу злоумышленника.

Чтобы предотвратить это, django отправит случайный ключ как в файле cookie, так и в форме данных. Затем, когда пользователи POSTs, он проверяет, идентичны ли два ключа. В случае, когда пользователь обманывается, сторонний веб-сайт не может получить файлы cookie вашего сайта, что вызывает ошибку auth.

  • 0
    @DmitryShevchenko Привет, пытаясь понять, чем этот метод ввода cookie + формы отличается от простой проверки реферера на стороне сервера? Все примеры, которые я нахожу, связаны с тем, что хакер обманывает пользователя, чтобы он отправлял со своего сайта реальный сайт.
  • 0
    Хорошо, я выяснил, почему реферер не используется. Во многих случаях он блокируется, поскольку иногда считается, что он содержит конфиденциальную информацию. Корпорации и их доверенные лица обычно делают это. Однако, если используется HTTPS, есть большая вероятность, что он не будет заблокирован.
Показать ещё 4 комментария
41

Сайт создает уникальный токен, когда он создает страницу формы. Этот токен необходим для отправки/получения данных обратно на сервер.

Поскольку токен генерируется вашим сайтом и предоставляется только тогда, когда создается страница с формой, некоторые другие сайты не могут имитировать ваши формы - у них не будет токена, и поэтому он не может публиковать на вашем сайте.

  • 8
    Может ли пользователь получить выходные данные токена в источнике, получить cookie-файл, отправленный ему, а затем отправить его со стороннего сайта?
  • 7
    @JackMarchetti да. но это будет дорогостоящим, так как каждый раз, когда вы хотите отправить форму со стороннего сайта, вам придется загружать страницу и анализировать токен. Токены CSRF должны идеально сочетаться с другими формами безопасности, если вы обеспокоены этим вектором атаки
Показать ещё 3 комментария
4

Корень всего этого заключается в том, чтобы убедиться, что запросы поступают от фактических пользователей сайта. Для форм создается токен csrf и должен быть привязан к пользовательским сеансам. Он используется для отправки запросов на сервер, в котором маркер проверяет их. Это один из способов защиты от csrf, другой - проверка заголовка referrer.

  • 6
    Не полагайтесь на заголовок реферера, его легко подделать.
  • 0
    Существует возможность .
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню