Добавить в корзинуПозвонить
Найти в Дзене
Цифровая Переплавка

🔒 CSRF и CORS: почему интернет до сих пор не определился, чего он боится больше?

Однажды любой разработчик задаётся простым вопросом: «Почему одновременно существуют и CSRF-защита, и CORS, разве они не дублируют друг друга?» Я сам не раз слышал подобные сомнения от коллег и решил разобраться в этом вопросе. Недавно прочитанная статья блогера SMAGIN лишь укрепила мой интерес к теме и помогла взглянуть на неё с новой стороны. Итак, попробуем вместе понять, зачем нам нужны и CSRF, и CORS, и почему они вовсе не мешают друг другу, а дополняют. 🚧 Сначала разберёмся с терминами: 🌐 CSRF (Cross-Site Request Forgery - межсайтовая подделка запроса)
Это атака, при которой злоумышленник заставляет браузер пользователя выполнять нежелательные действия от его имени. Например, вы заходите на сторонний сайт, где есть скрытая форма, отправляющая деньги с вашего банковского аккаунта, если вы залогинены в нём.
🎯 Защита: Проверка, действительно ли запрос отправлен с того же сайта, что и форма, обычно через специальный токен. 🌐 CORS (Cross-Origin Resource Sharing - совместное исполь

Однажды любой разработчик задаётся простым вопросом: «Почему одновременно существуют и CSRF-защита, и CORS, разве они не дублируют друг друга?» Я сам не раз слышал подобные сомнения от коллег и решил разобраться в этом вопросе. Недавно прочитанная статья блогера SMAGIN лишь укрепила мой интерес к теме и помогла взглянуть на неё с новой стороны. Итак, попробуем вместе понять, зачем нам нужны и CSRF, и CORS, и почему они вовсе не мешают друг другу, а дополняют.

🚧 Сначала разберёмся с терминами:

🌐 CSRF (Cross-Site Request Forgery - межсайтовая подделка запроса)
Это атака, при которой злоумышленник заставляет браузер пользователя выполнять нежелательные действия от его имени. Например, вы заходите на сторонний сайт, где есть скрытая форма, отправляющая деньги с вашего банковского аккаунта, если вы залогинены в нём.
🎯
Защита: Проверка, действительно ли запрос отправлен с того же сайта, что и форма, обычно через специальный токен.

🌐 CORS (Cross-Origin Resource Sharing - совместное использование ресурсов между разными источниками)
Механизм, который разрешает или запрещает кросс-доменные запросы из JavaScript-кода. Без него браузеры блокируют доступ к ресурсам, расположенным на других доменах или портах.
🎯
Зачем нужен: Безопасно контролировать обмен данными между разными сайтами.

🕵️ Но ведь браузеры по умолчанию уже что-то блокируют, верно?

Да, по умолчанию действует политика одного источника (Same-Origin Policy -SOP):

  • Разрешены простые межсайтовые (cross-site) запросы на запись (например, отправка форм).
  • Запрещены межсайтовые запросы на чтение (например, AJAX-запросы, получающие контент с другого сайта).

Именно поэтому нужен CORS — он позволяет явно указать, какие кросс-доменные запросы разрешены, и какие данные могут передаваться обратно.

📌 Интересный факт: В 2019 году появился атрибут cookie SameSite, изменивший поведение браузеров. Теперь браузеры не отправляют куки при кросс-доменных POST-запросах, если явно не указать иначе (атрибут SameSite=None). Это значительно снизило риск CSRF-атак.

🔐 Почему CSRF-защита по-прежнему нужна?

Казалось бы, CORS уже ограничил чтение данных, а SameSite cookies ограничили отправку кук при межсайтовых запросах. Зачем тогда нужен CSRF-токен?

Причины всё ещё актуальны:

  • 🎯 Формы всё ещё могут отправлять данные без CORS-проверок. Старые браузеры и сайты остаются уязвимы.
  • 📲 Токен защиты CSRF помогает убедиться, что запрос на запись был отправлен именно вашим сайтом и никаким другим.
  • 🔄 Универсальный механизм: CSRF-токен можно использовать и для JS-запросов, и для обычных HTML-форм. Это удобно и стандартизировано во многих веб-фреймворках.

Кстати, токены CSRF часто регулярно обновляются. Почему? Ответ прост — это уменьшает риск их перехвата или случайного раскрытия через логи или сессии, которые могли бы быть скомпрометированы.

🤔 А где тут противоречие?

На первый взгляд кажется, что мы имеем два механизма, которые частично пересекаются. Но на деле они решают две разные проблемы:

  • 🛡️ CORS контролирует, какие ресурсы могут быть прочитаны с другого домена и какие типы запросов допустимы (в основном это касается AJAX и JS).
  • 🔑 CSRF-защита не даёт выполнять действия от имени пользователя без его ведома (в основном это касается POST-запросов форм и действий пользователя).

🚦 Как браузеры стали центральной точкой безопасности

Важно понимать, что всю эту защиту реализуют именно браузеры. Они:

  • 📵 Блокируют межсайтовые чтения по умолчанию.
  • 🔎 Выполняют CORS preflight (предварительную проверку запросов) перед выполнением опасных операций (PUT, DELETE).
  • 🍪 Контролируют отправку куки через SameSite.

Именно от реализации браузеров зависит, насколько надёжно работают эти механизмы. К сожалению, некоторые браузеры до сих пор не поддерживают новые стандарты (например, UC Browser).

💡 Личное мнение автора:

Как разработчик, я считаю, что наличие и CSRF-защиты, и CORS сегодня оправдано, но ситуация постепенно упрощается благодаря новым стандартам. Однако старые браузеры и огромная база легаси-кода продолжают усложнять ситуацию.

Нам стоит:

  • 🧹 Постепенно отказываться от старых браузеров.
  • 🔧 Переходить на современные фреймворки, где обе защиты реализованы «из коробки».
  • 📚 Повышать осведомлённость разработчиков о современных механизмах безопасности.

В идеале, мы должны прийти к единому, понятному и надёжному стандарту, но путь до него пока далёк.

🚀 Итоги и выводы:

  • 🗃️ CORS и CSRF-защита — это не дублирование, а взаимное дополнение.
  • 🌐 SameSite cookies существенно уменьшили необходимость в CSRF-токенах, но не устранили полностью.
  • 📈 Мы движемся к упрощению, но полная безопасность требует времени и совместных усилий разработчиков браузеров и веб-сайтов.

Надеюсь, эта статья помогла вам лучше понять различия и необходимость существования двух механизмов защиты. А пока не забывайте проверять токены и правильно настраивать CORS!

🔗 Полезные ссылки:

🌍🔑🛡️