Ответ 1
Вы можете просто установить заголовок X-Requested-With
, а затем проверить его на стороне сервера. Многие фреймворки, такие как JQuery, автоматически добавляются к запросам AJAX.
X-Requested-With
является де-факто стандартом для указания того, что запрос выполняется через AJAX.
Вам не нужен случайный токен, так как невозможно передать этот заголовок кросс-домену без выбора сервера через CORS.
Следовательно, установка и проверка нестандартного заголовка является допустимым способом защиты от CSRF.
OWASP CSRF Предупреждающий чит-лист не упоминает об этом, однако он упоминает проверку заголовка Origin
. Однако логика для этого не проста, так как многие браузеры не отправляют Origin
для тех же запросов происхождения.
Также это работает только для запросов AJAX. При обычной форме POST невозможно добавить дополнительные заголовки. Кроме того, в прошлом были ошибки с плагинами, такими как Flash, которые позволяли устанавливать любой заголовок, позволяя злоумышленнику использовать Flash для запроса кросс-домена. Однако такие проблемы давно уже исправлены.
Если вы хотите использовать токен, а также часть стратегии защиты в глубину, вы можете адаптировать X-Requested-With
, чтобы включить случайный токен, который вы затем проверяете. например X-Requested-With: XMLHttpRequest;0123456789ABCDEF
.
Тогда токен может быть просто значением cookie, созданным только для целей предотвращения CSRF (сгенерировано с помощью криптографически безопасного алгоритма и энтропийного источника, конечно).