/** * IP制限の許可リスト(D-072 / D-077 項5 / D-079 項1)。 * * ★`lib/config/index.ts` に足さないこと★ * `index.ts` は `lib/judge/` から広く import されており、ここに書くと * `proxy` のバンドルに judge 系を引きずり込む。Next.js のガイドも * 「proxy は shared modules に依存すべきでない」と警告している。 * `lib/config/advice-rules.ts` が独立ファイルになっている前例に倣う。 * * ★ハードコード禁止(CLAUDE.md §7)のため、判定側から直接IPを書かずここを参照する★ * 値は運用で変わるので、変えるときはこのファイルだけを直す。 * * ★書き方の注意★ * - 判定は「文字列の完全一致」だけ。CIDR / レンジ / ワイルドカードには対応していない(P1 の割り切り)。 * `192.0.2.0/24` のように書いても、その文字列と完全一致するIPは存在しないので★常に拒否★になる。 * 拠点ネットワーク全体を許可したくなった時点で、このファイルと `isAllowedIp()` を作り直すことになる。 * - ★nginx が実際に付ける表記をそのまま書くこと。ログで実際の値を確認してから登録する★ * (`::1` / `::ffff:203.0.113.10` / `[2001:db8::1]:54321` のような表記ゆれは * 正規化しないので、書き方が違うだけで拒否される) * - ★プライベートIP(`10.x` / `172.16-31.x` / `192.168.x`)を書かないこと★。 * 万一プロキシが2段だった場合、末尾は LB の内部IPになる。そこに一致してしまうと * 「全員素通り」という逆方向の事故になる(1段確定なら全員403で即座に気づける)。 */ export const ALLOWED_IPS: readonly string[] = [ // 例: "203.0.113.10", ]; /** * 許可リストが空のとき、IP制限を「かけない」か「全拒否」か(★誤って全公開しないため明示する★)。 * * 既定は `true`(開発を止めないため)。★本番では `false` にすること★(D-101)。 * ★これは「ip が取れているとき」の話に限定される★ — ヘッダから接続元が取れない * 直接アクセスの可否は `ALLOW_DIRECT_ACCESS` だけが決める(下記および isAllowedIp() 参照)。 */ export const ALLOW_ALL_WHEN_EMPTY = true; /** * ★X-Forwarded-For が無い/末尾から N 番目が取れない = nginx を経由していない直接アクセス★ * を通すかどうか。★環境変数から読む(2026-09-10 のユーザー判断。D-101)★。 * ローカル開発でだけ `.env.local` に `ALLOW_DIRECT_ACCESS=true` を書く。 * ★本番では設定しない(未設定 = false = 拒否)★ * ★ALLOW_ALL_WHEN_EMPTY で代用しないこと★ — * 代用すると、allowlist が空の初期状態のまま本番へ出た瞬間に直接アクセスが素通りする。 * * ★`=== "true"` であること。`!== "false"` にしないこと★ * 未設定・空文字・タイポ・`1`・`TRUE` — すべて `false`(拒否)になり、 * 本番で設定し忘れても安全側(fail-closed)に倒れる。 * ★既存の `USE_FIXTURES`(`lib/db/use-fixtures.ts`)は `!== "false"` だが、 * あれは「開発しやすさ優先」の設計。セキュリティに関わる本設定は意図的に逆向きにしてある。 * 「既存に合わせて統一しよう」として戻さないこと(D-101)★ */ export const ALLOW_DIRECT_ACCESS = process.env.ALLOW_DIRECT_ACCESS === "true"; /** * 自分の前段にある「信頼済みプロキシ」の段数(D-077 項5 / ★D-079 項1★)。 * `clientIp()` は X-Forwarded-For の ★末尾から この数だけ遡った要素★ を採用する。 * * ★1 で確定★ — LB と nginx は同一(プロキシは1段)。2026-09-08 のユーザー回答(D-079 項1)。 * ★定数に畳み込まず設定値のまま残すこと★: 将来 LB → nginx の2段構成になった場合、 * ここを 2 にするだけで直る(コード変更不要)。2段だと末尾が LB の内部IPになり * 全員403になる= fail-closed で即座に気づける(指示書I の「リスク評価」節)。 */ export const TRUSTED_PROXY_HOPS = 1;