Столкновения токенов CSRF с несколькими вкладками
Я построил защиту CSRF в своем приложении, просто создав случайный токен на странице каждый, поставив его в сеанс и связав токен с <body>
атрибут тега:
<body data-csrf-token="csrf_GeJf53caJD6Q5WzwAzfy">
Затем на каждом этапе action или ajax-запрос я просто извлекаю токен из тега body и отправляю его.
Это отлично работает, за исключением огромной проблемы. Пользователи открывают несколько вкладок приложения, и я вижу токен-коллизии. Например, пользователь загружает первую страницу и генерирует токен, затем они переключают вкладки, загружают другую страницу, которая генерирует новый токен. Наконец, они возвращаются на первую страницу и отправляют действие формата. Это приводит к недопустимой ошибке токена CSRF.
Каков наилучший способ перепроектировать это, чтобы предотвратить столкновение с несколькими вкладками, сохраняя при этом как можно более безопасным.
Просто генерирует один токен при правильном входе в систему, вместо того, чтобы генерировать новый токен при каждой загрузке страницы?
Ответы
Ответ 1
Предполагая, что ваше приложение защищено с помощью SSL, тогда действительно не создается никакого значения, создавая новые токены при каждой загрузке страницы. Он не останавливает злоумышленника, который использовал уязвимость XSS – в любом случае у них будет доступ к только что созданному маркеру.
Помните, что защищает токен CSRF: злоумышленная сторонняя страница, слепо пытающаяся отправить данные в ваше приложение, надеется, что пользователь войдет в систему. При таком типе атаки злоумышленник никогда не получит доступ к токену CSRF, поэтому его изменение часто не приносит пользы.
Не тратьте время и ресурсы на отслеживание нескольких токенов за сеанс. Просто сгенерируйте его в начале и делайте.
Ответ 2
При входе в систему вы можете использовать один токен. Как указывает @Josh3736, это работает отлично.
Если вы действительно хотите иметь один токен на странице, вы можете сохранить массив действительных токенов в $_SESSION. После этого вы истекли отдельные токены, поскольку они используются. Вы также можете опережать их после некоторого периода ожидания, но это имеет смысл только в том случае, если таймаут короче тайм-аутов сеанса. Но, опять же, что вы на самом деле делаете с этим? Единственный токен отлично подходит для целей CSRF.