Столкновения токенов CSRF с несколькими вкладками

Я построил защиту CSRF в своем приложении, просто создав случайный токен на странице каждый, поставив его в сеанс и связав токен с <body> атрибут тега:

<body data-csrf-token="csrf_GeJf53caJD6Q5WzwAzfy">

Затем на каждом этапе action или ajax-запрос я просто извлекаю токен из тега body и отправляю его.

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

Каков наилучший способ перепроектировать это, чтобы предотвратить столкновение с несколькими вкладками, сохраняя при этом как можно более безопасным.

Просто генерирует один токен при правильном входе в систему, вместо того, чтобы генерировать новый токен при каждой загрузке страницы?

+15
18 нояб. '13 в 20:29
источник поделиться
2 ответа

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

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

Не тратьте время и ресурсы на отслеживание нескольких токенов за сеанс. Просто сгенерируйте его в начале и делайте.

+12
18 нояб. '13 в 20:35
источник

При входе в систему вы можете использовать один токен. Как указывает @Josh3736, это работает отлично.

Если вы действительно хотите иметь один токен на странице, вы можете сохранить массив действительных токенов в $_SESSION. После этого вы истекли отдельные токены, поскольку они используются. Вы также можете опережать их после некоторого периода ожидания, но это имеет смысл только в том случае, если таймаут короче тайм-аутов сеанса. Но, опять же, что вы на самом деле делаете с этим? Единственный токен отлично подходит для целей CSRF.

+2
18 нояб. '13 в 20:31
источник

Посмотрите другие вопросы по меткам или Задайте вопрос