# cors フック：CORS オリジンを監査する

> コマンドラインから、ソースコードをスキャンして回避可能な CORS オリジン許可リストを探したり、1 つのオリジン値の許可範囲が広すぎないかを判定したりできます。

正規 URL: https://lagune.ai/ja-JP/docs/hooks/cors
言語: ja-JP
原文: https://lagune.ai/docs/hooks/cors
最終更新日: 2026-11-03

`cors` フックは [`http-request` 専門知識](https://lagune.ai/ja-JP/docs/catalog) を支える決定論的なエンジンで、自分で実行することもできます。1 つのコマンドで 2 つのモードが使えます：**scan** モードはソースコードをスキャンして**回避可能なオリジン許可リスト**（攻撃者のホストがすり抜けられる、ホスト検証用の正規表現）を探し、**score** モードは 1 つの **CORS オリジン**の値を `wildcard`、`null`、`safe` のいずれかに判定します。

## コードベースをスキャンする

フラグを付けなければ、プロジェクト全体をスキャンします。

**プロジェクト全体**

```bash
npx lagune read cors
```

**ディレクトリ**

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

**1 つのファイル**

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

回避可能な許可リストを、ファイルごとにまとめて 1 つの見出しの下に一覧表示します。信頼するホストのサフィックスより前のオーソリティ部分に `.+`/`.*` があるホスト検証（`^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
```

これは確定した検出事項ではなく、要確認の手がかりです。その正規表現が実際の信頼判断を左右しているかどうかはテキストからは判定できないため、スキャンによって終了コードが変わることはありません。一つひとつ読んで、許可リストが完全一致で比較しているかを確認してください。何も見つからなければ、1 行だけ出力します。

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

## オリジンを判定する

各オリジンを `--origin` で渡します。フックはオリジンごとに 1 語を出力し、`wildcard` または `null` が 1 つでもあれば 0 以外の終了コードで終了します。

**1 つのオリジン**

```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` を繰り返し指定すると、許可リスト全体を 1 回の呼び出しで判定でき、指定した順に 1 行に 1 つずつ判定を出力します。

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

| 判定       | 意味                                                                                                              |
| ---------- | ----------------------------------------------------------------------------------------------------------------- |
| `safe`     | `*`、`null`、`*` を使ったグロブのいずれでもない。オリジンの形式が正しいことまでは保証しない。                     |
| `wildcard` | `*`、またはサブドメイン、ホスト、ポートのグロブ：どのサイト（あるいは広範なサイト群）でもレスポンスを読み取れる。 |
| `null`     | `null` オリジン。サンドボックス化された iframe やリダイレクトで偽装できる。                                       |

許可を意味するのは `safe` だけです。また、`--origin` は値のオラクルです。判定するのはハンドラーではなく値なので、ハンドラーは `http-request` 専門知識で確認してください。

### CLI オプション

| オプション | 値           | 説明                                                                                  |
| ---------- | ------------ | ------------------------------------------------------------------------------------- |
| `--origin` | オリジン     | 1 つのオリジン値を判定する。繰り返し指定すると複数を判定し、1 行に 1 つずつ出力する。 |
| `--dir`    | ディレクトリ | スキャン対象をディレクトリに絞る。繰り返し指定でき、`--file` と併用できる。           |
| `--file`   | ファイル     | スキャン対象を 1 つのファイルに絞る。繰り返し指定でき、`--dir` と併用できる。         |

オプションを指定しなければ、プロジェクト全体をスキャンします。`--origin` は score モードで、`--dir` や `--file` とは併用できません。

**対象外の範囲**

スキャンが読み取るのは**回避可能な正規表現**という形で、`--origin` が判定するのはオリジンの**値**です。ソースコード上の次の 2 つのパターンは対象外です：リクエストの `Origin` の反射（サーバーが受け取った `Origin` をそのまま返す、または認証情報と組み合わせて返す）と、`endsWith` や部分文字列による緩い許可リストです。これらはコードを読んで見分け、[`http-request` 専門知識](https://lagune.ai/ja-JP/docs/catalog) の説明に沿って対処してください。

## よくある質問

### CORS の null オリジンが危険なのはなぜですか？

サンドボックス化された iframe や一部のリダイレクトは Origin: null を送信するため、null を信頼する許可リストは、そうしたコンテキストに読み取りアクセスを与えてしまいます。cors フックは、ワイルドカードと並んでこれも指摘します。

### 回避可能な CORS オリジン許可リストを見つけるにはどうすればよいですか？

コードベースに対して npx lagune read cors を実行します。信頼するサフィックスより前に貪欲なワイルドカードがあるホスト検証用の正規表現を指摘します。こうした正規表現では、your-site.com.attacker.com のような攻撃者のホストがすり抜けてしまいます。
