Какую безопасность обеспечивает механизм CORS?

Ответ

CORS (Cross-Origin Resource Sharing) — это механизм безопасности браузера, который позволяет веб-приложениям, запущенным на одном домене (origin), получать доступ к ресурсам на другом домене. Он является контролируемым исключением из Same-Origin Policy (SOP) — фундаментального принципа безопасности, который по умолчанию запрещает скриптам доступ к ресурсам с другого домена.

Безопасность CORS заключается в следующем:

  1. Предотвращение несанкционированного доступа к данным: CORS не позволяет вредоносному скрипту, запущенному на одном сайте, читать конфиденциальные данные с другого сайта без явного разрешения целевого сервера. Это защищает от атак, связанных с утечкой данных.
  2. Контроль над междоменными запросами: Сервер явно указывает, какие домены, HTTP-методы и заголовки разрешены для доступа к его ресурсам. Это дает разработчикам точный контроль над тем, кто и как может взаимодействовать с их API.

Как это работает (упрощенно):

  • Простые запросы: Браузер отправляет запрос напрямую, добавляя заголовок Origin. Сервер отвечает с Access-Control-Allow-Origin, указывая разрешенный домен. Если домен не разрешен, браузер блокирует доступ к ответу.
  • Сложные запросы (Preflight): Для запросов, которые могут иметь побочные эффекты (например, PUT, DELETE, запросы с нестандартными заголовками), браузер сначала отправляет предварительный OPTIONS запрос (preflight). Сервер отвечает, указывая разрешенные методы и заголовки. Только если preflight успешен, браузер отправляет основной запрос.

Пример настройки CORS в Flask:

from flask import Flask, jsonify
from flask_cors import CORS

app = Flask(__name__)
# Разрешить запросы только с 'https://trusted-domain.com' для всех API-эндпоинтов
CORS(app, resources={r"/api/*": {"origins": "https://trusted-domain.com"}})

@app.route("/api/data")
def get_data():
    return jsonify({"data": "secure"})

Таким образом, CORS не предотвращает отправку запросов браузером (это может сделать любой скрипт), но он контролирует доступ к ответам на эти запросы, обеспечивая, что только доверенные источники могут читать данные.

Ответ 18+ 🔞

Да ты послушай, что за дичь творится в интернетах! Вот сидит, блядь, твой скрипт на сайте pornhub-ot-babushki.ru и пытается стырить данные с my-bank-secret-api.com. А браузер ему такой: «Нихуя, дружок-пирожок, не пущу!». Это и есть та самая политика одного источника, SOP, блядь. Как будто стена между районами.

А CORS — это такой официальный пропуск через эту стену, ёпта! Не просто дырка в заборе, а контрольно-пропускной пункт с охраной и бумажками.

В чём, сука, безопасность-то?

  1. Чтоб не совали свой нос куда не просят. Без этого любой сайт-одностраничник мог бы, как хитрая жопа, тихо запросить твою почту из Gmail, если ты в ней авторизован. CORS не даёт просто так прочитать ответ. Сервер должен явно сказать: «Да, trusted-site.com, я тебе доверяю, забирай мои данные».
  2. Точный контроль, а не просто «всем можно». Сервер — царь и бог. Он говорит: «Ладно, пусть заходят с good-guys.ru, но только методом GET и без своих левых заголовков X-My-Shady-Header». Всё по протоколу, блядь!

Как это, сука, работает?

  • Простые запросы (как будто за хлебом сходил): Браузер летит к серверу и сразу кричит в заголовке Origin: «Я с pornhub-ot-babushki.ru, дай данных!». Сервер смотрит в свой список доверенных и либо отвечает «О, да, конечно, вот тебе Access-Control-Allow-Origin: pornhub-ot-babushki.ru и печеньки», либо посылает нахуй. Браузер, получив отказ, скрипту просто не отдаст эти данные, хоть он обосрись.
  • Сложные запросы (Preflight, или «Сначала покажи документы»): Это когда твой скрипт собрался не просто посмотреть, а что-то изменить — PUT, DELETE или со своим хитрожопым заголовком. Браузер, такой бдительный, сначала шлёт запрос-разведку OPTIONS: «Э, сервак, можно я к тебе вот так вот приду?». Сервер проверяет: «Метод PUT? Разрешаю. Заголовок X-Admin-Key? А вот это, блядь, нет, не разрешаю». И если по хоть одному пункту не сошлось — основной запрос даже отправлен не будет. Представь, охрана на КПП не пустила, потому что у тебя в сумке гиря, а не документы.

Вот смотри, как на Flask это выглядит, чтоб не быть, как тот Герасим, немым:

from flask import Flask, jsonify
from flask_cors import CORS

app = Flask(__name__)
# Разрешаем запросы ТОЛЬКО для путей, начинающихся на /api/ и ТОЛЬКО с 'https://trusted-domain.com'
# Всем остальным — иди нахуй, волнение ебать.
CORS(app, resources={r"/api/*": {"origins": "https://trusted-domain.com"}})

@app.route("/api/data")
def get_data():
    return jsonify({"data": "secure"})

Короче, CORS — это не про то, чтобы запрос не ушёл. Запрос-то уйдёт всегда, если скрипт его отправит. Это про то, чтобы браузер не дал скрипту прочитать ответ, если сервер его не благословил. Всё честно, блядь. Как на таможне: посылку отправить можешь, а получить — только если все печати в порядке.