HTTP(S) запрос безопасности с использованием случайных заголовков
Я это понимаю CSRF
является серьезной проблемой безопасности для приложений на основе HTTP(S).
Судя по всему, большинство фреймворков отправляют CSRF
токен как часть тела запроса. Однако в моем случае это несколько не элегантно по нескольким причинам; самое главное, я не хочу связываться с транспортным уровнем, который может отправить POST
запросы в разных форматах, не обязательно все JSON
или же x-www-form-urlencoded
,
В качестве решения я думал о гораздо менее навязчивой альтернативе; в частности, я генерирую случайный заголовок: случайное имя заголовка (общий префикс), содержащий случайный CSRF
маркер.
Есть ли какой-либо риск безопасности (или другой вид) для этого?
2 ответа
Вы можете просто установить 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 (конечно, генерируемым с помощью криптографически безопасного алгоритма и источника энтропии).
Есть ли какой-либо риск безопасности (или другой вид) для этого?
Нет: как только вы сможете передать его с клиента и проверить на сервере - все нормально
Кроме того, как часто я должен обновлять токен CSRF? Нужен ли мне новый для каждого запроса, или каждые несколько запросов, или один раз за посещение сайта и день, или...?
Как правило, вы не должны обновлять его вообще. Если он сгенерирован с использованием криптографически сильного генератора случайных чисел - вы можете иметь один за сеанс. Важно то, что невозможно было угадать это, поэтому оно не должно происходить из каких-либо известных данных.