Начнем с аналогии. Представьте, что вы оставляете дверь в свой дом открытой, потому что вам лень провернуть ключ в замке. Сначала всё кажется нормально, но однажды к вам приходит неадекватный сосед и заявляет, что это теперь его дом, ведь двери-то открыты и вроде бы никто не против. То же самое может произойти с вашим API, если вы не настроите защиту вроде CORS.
Хотя ваш API — это не физический дом, он определенно нуждается в защите. Без правильной настройки вы можете открыть своё приложение для множества угроз.
Какие проблемы возникают при отсутствии CORS?
- Cross-Site Scripting (XSS): одна из главных угроз
Вот классический пример: ваш API не настроен для ограничения запросов только с определённых источников. Злоумышленник создает вредоносный сайт и встраивает туда скрипт, который отправляет запросы к вашему API. Браузер доверяет этому сайту (ведь CORS не ограничил источник), и вуаля — злоумышленник может делать с вашим API почти что угодно.
Допустим, ваше приложение управляет банковскими аккаунтами. Без CORS кто-то может легко инициировать перевод средств от имени пользователя, используя его действующую сессию в браузере. Такая проблема известна как Cross-Site Request Forgery (CSRF).
- Доступ к важным данным из любого места.
Без CORS ваш API становится доступным кому угодно и откуда угодно. Да-да, если хакер решит запросить у вашего сервера данные, браузер ничем не будет препятствовать этому, потому что отсутствуют ограничения на источники.
Например, вы создали API для выдачи личных данных о пользователях (ну, вдруг). Если этот API не настроен должным образом, ваш конкурент или более злонамеренная сторона может подвергнуть ваш сервер массовым запросам, чтобы выкачать базу данных клиентов. Приятного мало, правда?
Почему сами браузеры нас не защищают?
Многие новички задаются вопросом, почему браузеры просто не запрещают кросс-доменные запросы априори. На самом деле, браузер пытается нас защитить, но ему нужны инструкции от разработчика (то есть от нас).
Например:
- Если API заявляет: "Я принимаю запросы только от домена
https://frontend.com", браузер будет блокировать запросы с других доменов. - А если API молчит? Тогда браузер ничего не блокирует.
Но это не значит, что браузеры плохие. Это значит, что мы, как разработчики, обязаны правильно настроить доступ.
Примеры реальных уязвимостей
Давайте рассмотрим несколько типичных сценариев, к чему приводит отсутствие CORS:
- Пример 1: Вредоносный скрипт крадёт данные.
У вас есть API, который выдаёт данные о пользователе через GET-запрос. Пользователь заходит на ваш сайт, авторизуется, и его сессия становится активной. Теперь пользователь случайно заходит на вредоносный сайт, который отправляет скрытый запрос к вашему API. Браузер передает сессийный токен в запросе, и API честно возвращает личные данные пользователя злоумышленнику. - Пример 2: DDoS-атака через открытый API.
Если ваш API открыт, кто угодно может программно генерировать тысячи запросов к нему. Это не только создаёт нагрузку на сервер, но и может полностью исчерпать ресурсы вашего приложения. В результате приложение становится недоступным для нормальных пользователей. Такие атаки известны как DDoS-атаки (Distributed Denial of Service). - Пример 3: Манипуляции с ресурсами.
Представьте интернет-магазин. Злоумышленник может создать вредоносный сайт, который делает запросы к вашему API, чтобы оформить фиктивные заказы. Это может как захламить базу данных, так и нанести прямой финансовый ущерб (например, при мошенничестве с промокодами).
Почему важно ограничивать доступ к API?
Когда API открыт для всех подряд — это как вышеупомянутая дверь без замка. Может зайти кто угодно и сделать что угодно. А нам ведь важно контролировать, кто и как взаимодействует с нашим приложением.
Во-первых, это вопрос доверия: мы хотим быть уверены, что наш API вызывают только те фронтенды и приложения, которым мы это разрешили. Например, сайт и мобильное приложение — пожалуйста. Всё остальное — извините, проезд закрыт.
Во-вторых, важно управлять тем, что именно разрешено. Где-то хватит простого GET, а где-то нужно ограничить возможность менять или удалять данные. Всё это — про безопасность, стабильность и адекватное поведение приложения.
Чем CORS лучше других решений?
Ладно, скажете вы, а почему мы просто не добавим какую-нибудь аутентификацию и всё? Хоть это и важно, но аутентификация не решает полностью проблему CORS. Вот почему:
- CORS управляется на уровне браузера. Это значит, что запросы будут блокироваться до того, как они даже дойдут до вашего сервера.
- Мгновенная защита от незнакомых источников. CORS действует как первая линия обороны, сокращая количество потенциально вредоносных запросов из недоверенных источников.
Что делать, если CORS отсутствует из-за API?
Иногда бывает, что ваш сервер не поддерживает настройку CORS, и браузер блокирует запросы даже от вашего фронтенда. В таких случаях можно использовать сервер-прокси, чтобы выступать посредником между фронтендом и API. Но этот подход требует дополнительных усилий и часто применяется как временное решение.
Итог
Настройка CORS — это не просто опциональный этап разработки. Это основа безопасности вашего API, особенно если ваш API взаимодействует с браузерами. Без него злоумышленники могут легко использовать ваш API для действий, которые вы бы никогда не разрешили. Теперь, когда мы рассмотрели все эти угрозы, к следующей лекции вы точно будете готовы приступить к практике и научитесь грамотно настраивать CORS в FastAPI.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ