Почнемо з аналогії. Уяви, що ти залишаєш двері в своєму будинку відкритими, бо тобі лінь провернути ключ у замку. Спочатку все здається нормально, але одного разу приходить неадекватний сусід і заявляє, що це тепер його дім, бо двері відкриті і ніби ніхто не проти. Те саме може статися з твоїм 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.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ