Двойка Отослать Cookies и несколько вкладок?

Механизм двойного представления файлов cookie требует использования файлов cookie. Тем не менее, файлы cookie используются всеми вкладками браузера. Как реализовать этот механизм, не ломая кнопки "Назад" и вкладки браузера?

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

С другой стороны, если я использую отдельный файл cookie для каждой вкладки, как сервер узнает, какой файл cookie искать? А также, если вам нужно использовать скрытое поле для указания имени файла cookie, открывает ли оно каким-либо образом новые возможности для защиты (поскольку злоумышленники, использующие CSRF, могут изменять значения форм)?

ОБНОВЛЕНИЕ:

  • Реализация должна быть без сохранения состояния /RESTful. Нет серверной "сессии".
  • Вы можете предположить, что я контролирую все субдомены, поэтому злоумышленники не смогут писать свои собственные куки.

Ответ 1

Вы можете создать конкретный файл cookie, который создается один раз для сеанса пользователя. например Один из них называется "CSRFCookie". Обязательно установите Secure Flag, чтобы это было отправлено только через HTTPS.

Поскольку вы не поддерживаете состояние сервера, имейте в виду, что это уязвимо для атак MiTM, поскольку я здесь:

Даже если ваш сайт доступен только через HTTPS, и вы правильно установите Secure Flag, следует соблюдать этот подход как атакующего может потенциально MiTM любое соединение с жертвой на любой HTTP-сайт (если злоумышленник, соответственно, размещен, конечно), перенаправить их в ваш домен через HTTP, который также является MiTM'd, а затем установить необходимое значение cookie. Это будет атака Session Fixation. Чтобы защититься от этого, вы можете выводить значение cookie в заголовок и поле скрытой формы каждый раз, когда эта страница загружается (поверх HTTPS), а не повторно использовать любое уже установленное значение cookie. Это связано с тем, что, хотя браузер может установить Защищенный флаг, он все равно будет отправлять файлы cookie без безопасного флага по HTTPS-соединению, и сервер не сможет определить, установлен ли флаг безопасности. (Атрибуты Cookie, такие как Secure Flag, видны только в том случае, если cookie установлен, а не когда он считывается. Единственное, что видит сервер, это имя и значение cookie.)

Итак, если вы хотите защитить от этого и не сломать свой сайт по нескольким вкладкам, вы должны отслеживать значение сервера "CSRFCookie".

В противном случае, если состояние сервера не сохраняется:

  • Для безопасного подхода к MiTM это значение должно быть сгенерировано на каждая форма загружает, но разрывает вкладки, когда значение cookie изменяется каждый время.
  • Если вы не хотите защищать от MiTM, вы можете просто генерировать значение "CSRFCookie" один раз, что позволит работать с несколькими вкладками/обратно.

Может быть решение для (1), которое включает в себя проверку наличия файла cookie, и если он уже увеличивает число в конце имени файла cookie и скрытого поля формы. например "CSRFCookie1", "CSRFCookie2" и т.д., поэтому каждая форма может иметь свой собственный файл cookie. Помните, что это может создать огромный объем данных, которые будут отправляться с каждым HTTP-запросом браузером на ваш сервер (даже изображения, .js и т.д.).

Другой вариант - использовать HSTS, чтобы браузер всегда перенаправлял любое HTTP-соединение с вашим сервером на HTTPS до того, как был сделан какой-либо запрос. Тем не менее, все еще есть окно возможностей для HTTP-соединения, которое должно быть MiTM'd, прежде чем любой запрос будет сделан на ваш сервер и установленный набор правил HSTS. Тем не менее, вы можете организовать, чтобы ваш сайт находился в предварительно загруженном списке HSTS из самых популярных браузеров, чтобы снизить риск. Это позволит вам использовать несколько вкладок без состояния сервера, поскольку вы просто используете тот же файл cookie ( "CSRFCookie" ) и значение для каждой формы, которая сгенерирована, если не установлена ​​или не установлена, если она уже установлена, а затем никогда не восстанавливается. Обратите внимание, что HSTS еще не поддерживается в IE , но поддержка может быть добавлена ​​в IE 12, однако см. здесь для поддержки браузера Edge.

Ответ 2

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