Безопасно ли раскрытие токена CSRF-защиты сеанса?

StackOverflow https://stackoverflow.com/questions/144696

  •  02-07-2019
  •  | 
  •  

Вопрос

Джанго поставляется с Промежуточное ПО защиты CSRF, который генерирует уникальный токен для каждого сеанса для использования в формах.Он сканирует все входящие POST запрашивает правильный токен и отклоняет запрос, если токен отсутствует или недействителен.

Я хотел бы использовать AJAX для некоторых запросов POST, но в этих запросах нет токена CSRF.На страницах нет <form> элементы для подключения, и я бы предпочел не портить разметку, вставляя токен как скрытое значение.Я считаю, что хороший способ сделать это — выставить такой вид, как /get-csrf-token/ чтобы вернуть токен пользователя, полагаясь на правила межсайтового скриптинга браузера, чтобы предотвратить его запрос враждебными сайтами.

Это хорошая идея?Есть ли лучшие способы защиты от атак CSRF, при этом разрешая запросы AJAX?

Это было полезно?

Решение

Если вы знаете, что вам понадобится токен CSRF для запросов AJAX, вы всегда можете встроить его куда-нибудь в HTML;затем вы можете найти его через Javascript, пройдя через DOM.Таким образом, у вас по-прежнему будет доступ к токену, но вы не будете предоставлять его через API.

Другими словами:сделайте это через шаблоны Django, а не через диспетчер URL.Так гораздо безопаснее.

Другие советы

ОБНОВЛЯТЬ:Приведенное ниже было правдой и должно быть правдой, если все браузеры и плагины были правильно реализованы.К сожалению, теперь мы знаем, что это не так, и что определенные комбинации плагинов браузера и перенаправлений могут позволить злоумышленнику предоставлять произвольные заголовки в междоменном запросе.К сожалению, это означает, что даже запросы AJAX с параметром «X-Requested-With:XMLHttpRequest» теперь должен быть защищен CSRF.В результате Джанго больше не освобождает запросы Ajax от защиты CSRF.

Оригинальный ответ

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

Это справедливо только в том случае, если вы действительно проверяете на стороне сервера заголовок X-Requested-With на наличие значения «XMLHttpRequest» (что делает Django) и освобождаете только реальные запросы AJAX от сканирования CSRF.

Отмените это, я был неправ.(Смотрите комментарии.) Вы можете предотвратить эксплойт, убедившись, что ваш JSON соответствует спецификации:Всегда убедитесь, что вы возвращаете литерал объекта как объект верхнего уровня.(Я не могу гарантировать, что дальнейших эксплойтов не будет.Представьте себе браузер, предоставляющий доступ к ошибочному коду в событиях window.onerror!)

Вы не можете полагаться на правила межсайтового скриптинга, чтобы обеспечить конфиденциальность ответов AJAX.Например, если вы вернете токен CSRF в формате JSON, вредоносный сайт может переопределить конструктор String или Array и запросите ресурс.

bigmattyh прав:Вам нужно встроить токен где-нибудь в разметке.В качестве альтернативы вы можете отклонить любые POST, которые делать есть реферер, который не делает соответствовать.Таким образом, только люди с чрезмерно усердными программными брандмауэрами будут уязвимы для CSRF.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top