# Хук cors: аудит джерел CORS

> Перевірте вихідний код на allowlist джерел CORS, який можна обійти, або оцініть окреме значення джерела на надто вільний доступ просто з командного рядка.

Канонічна URL-адреса: https://lagune.ai/uk-UA/docs/hooks/cors
Мова: uk-UA
Оригінал: https://lagune.ai/docs/hooks/cors
Останнє оновлення: 2026-11-03

Хук `cors` є детермінованим рушієм [спеціалізації `http-request`](https://lagune.ai/uk-UA/docs/catalog), і ви можете запускати його самі. Він працює у двох режимах однієї команди: **scan**, що перевіряє вихідний код на **allowlist джерел, який можна обійти** (регулярний вираз для перевірки хоста, повз який прослизає хост зловмисника), і **score**, що оцінює окреме значення **джерела CORS** як `wildcard`, `null` або `safe`.

## Перевірка кодової бази

Без прапорців хук перевіряє весь проєкт.

**Увесь проєкт**

```bash
npx lagune read cors
```

**Каталог**

```bash
npx lagune read cors --dir src/server
```

**Один файл**

```bash
npx lagune read cors --file internal/auth/origin.go
```

Він виводить кожен allowlist, який можна обійти, під одним заголовком, згрупувавши за файлами. Валідатор хоста, у якого `.+`/`.*` стоїть у сегменті authority перед суфіксом довіреного хоста (`^https?://.+\.trusted\.com`), пропускає хост зловмисника на кшталт `your-site.com.attacker.com`.

```text
Origin-allowlist patterns with a greedy wildcard (bypassable, review):

internal/auth/origin.go
  ^https?://.+\.trusted\.com
```

Це привід для перегляду, а не закрита знахідка: чи керує регулярний вираз реальним рішенням про довіру, неможливо визначити з тексту, тож перевірка ніколи не змінює код виходу. Перегляньте кожен і переконайтеся, що allowlist порівнює за повною рівністю. Якщо нічого не знайдено, хук виводить один рядок.

```bash
npx lagune read cors --dir src/clean
# => no bypassable origin allowlist found
```

## Оцінка джерела

Передайте кожне джерело через `--origin`. Хук виводить по одному слову на джерело й завершується з ненульовим кодом за будь-якого `wildcard` чи `null`.

**Одне джерело**

```bash
npx lagune read cors --origin '*'                       # => wildcard
npx lagune read cors --origin 'null'                    # => null
npx lagune read cors --origin 'https://app.example.com' # => safe
```

**Кілька джерел**

Повторіть `--origin`, щоб оцінити весь allowlist одним викликом, по вердикту на рядок, у тому самому порядку.

```bash
npx lagune read cors \
  --origin 'https://app.example.com' \
  --origin '*' \
  --origin 'null'
# => safe
# => wildcard
# => null
```

| Вердикт    | Значення                                                                                           |
| ---------- | -------------------------------------------------------------------------------------------------- |
| `safe`     | Не `*`, не `null` і не glob із `*`. Це не гарантує, що джерело правильно сформоване.               |
| `wildcard` | `*` або glob піддомену, хоста чи порту: будь-який сайт (або широке їх коло) може читати відповідь. |
| `null`     | Джерело `null`, яке можуть підробити iframe у пісочниці й перенаправлення.                         |

Дозволом є лише `safe`, а `--origin` є оракулом значень: він оцінює значення, а не обробник, тож перевірте обробник за допомогою спеціалізації `http-request`.

### Параметри CLI

| Параметр   | Значення | Опис                                                                              |
| ---------- | -------- | --------------------------------------------------------------------------------- |
| `--origin` | джерело  | Оцінити одне значення джерела. Повторіть, щоб оцінити кілька, по одному на рядок. |
| `--dir`    | каталог  | Обмежити перевірку каталогом. Повторюється й поєднується з `--file`.              |
| `--file`   | файл     | Обмежити перевірку одним файлом. Повторюється й поєднується з `--dir`.            |

Без параметрів хук перевіряє весь проєкт. `--origin` вмикає режим score і не поєднується з `--dir` чи `--file`.

**Чого він не охоплює**

Перевірка розпізнає форму **регулярного виразу, який можна обійти**, а `--origin` оцінює **значення** джерел. Два шаблони на рівні вихідного коду залишаються поза її межами: віддзеркалення `Origin` запиту (сервер повертає вхідний `Origin` назад або поєднує його з обліковими даними) і надто вільний allowlist на основі `endsWith` чи підрядка. Розпізнайте їх у коді й діяйте так, як описує [спеціалізація `http-request`](https://lagune.ai/uk-UA/docs/catalog).

## Часті запитання

### Чому джерело CORS null небезпечне?

Iframe у пісочниці й деякі перенаправлення надсилають Origin: null, тож allowlist, що довіряє null, дає цим контекстам доступ на читання. Хук cors позначає його разом із wildcard.

### Як виявити allowlist джерел CORS, який можна обійти?

Виконайте npx lagune read cors над кодовою базою. Він позначає регулярний вираз для перевірки хоста, у якого жадібний wildcard стоїть перед довіреним суфіксом, тож хост зловмисника на кшталт your-site.com.attacker.com прослизає повз нього.
