結論(Refererをアクセス制御に使っていない)
Refererをアクセス制御に使っていないかとは、「ログイン画面から来た場合だけ表示する」のように、HTTPのRefererヘッダーやJavaScriptのdocument.referrerで閲覧可否を決めていないかを確かめる診断項目です。Refererは送信元が自由に設定・削除できるため、CWE-293のとおり認証の根拠になりません。閲覧可否はサーバー側で認証済みセッションを検証して決めます。
この記事のポイント
- Refererはブラウザのスクリプトからは設定できませんが、curlやプロキシツールでは任意の値を送れます。
- document.referrerによる判定はブラウザ内で動くため、保護対象URLを直接取得するだけで回避できます。
- 既定のReferrer-Policyやプライバシー設定、ブックマークからの直接アクセスでは参照元が空になり、正規の利用者が弾かれます。
- セキュリティAIチェッカーは、document.referrerの比較とその結果による遷移・認証処理が近接して現れる兆候を△(要確認)と判定します。
- Referer判定を消すだけでは完全公開になります。代替の認証を有効化してから旧判定を削除します。
| 診断項目名 | Refererをアクセス制御に使っていない |
|---|---|
| 項目ID | auth.referrer-gate-signal |
| 分類 | 認証・アクセス制御 |
| 重大度・配点の重み | 最重要(critical) 重み 5 |
| 関連する標準・ガイドライン | OWASP ASVS 5.0.0 V8.3.1(認可を信頼できるサービス層で強制し、利用者が操作できる制御に依存しない)、V8.2.1(機能単位のアクセス制限)/OWASP WSTG-ATHN-04(Bypassing Authentication Schema)、WSTG-ATHZ-02(Bypassing Authorization Schema)/CWE-293(Using Referer Field for Authentication)、CWE-602(Client-Side Enforcement of Server-Side Security)/IPA「安全なウェブサイトの作り方」1.11 アクセス制御や認可制御の欠落 |
Refererをアクセス制御に使っていないかとは
Refererをアクセス制御に使っていないかとは、「ログイン画面(またはトップページ)から来た場合だけ表示する」「自サイトからのリンク経由でなければ追い返す」という制御を、HTTP の Referer ヘッダーや JavaScript の document.referrer で実現していないかを確かめる診断項目です。
// 危険な例:遷移元URLで閲覧可否を決めている
if (document.referrer.indexOf("/login.htm") == -1) { location.href = "/"; }
Referer は送信元が自由に設定・削除できる情報です。CWE-293(Using Referer Field for Authentication)は、Referer フィールドは容易に改変でき、完全性の確認手段として妥当ではないと説明しています。セキュリティAIチェッカーは、トップページHTMLのスクリプトで document.referrer を比較し、その結果で遷移・認証に関わる処理を行っている兆候を検出します。
Referer と document.referrer の違い
| 項目 | Referer(リクエストヘッダー) | document.referrer(JavaScript) |
|---|---|---|
| 正体 | ブラウザが遷移元URLを伝えるリクエストヘッダー | 現在の文書へ遷移してきた元の文書のURLを読むプロパティ(ポリシーにより切り詰め・空になる) |
| 偽装・回避 | ブラウザ上のスクリプトからは設定できない禁止ヘッダー(forbidden request header)だが、curl -H "Referer: ..." やプロキシツールでは任意の値を送れる | 判定がブラウザ内で行われるため、スクリプトを無効化する、保護対象URLを直接取得する、コンソールで処理を飛ばすだけで回避できる |
参照元は正規の利用者でも空になる
MDN の説明のとおり、既定の参照元ポリシー strict-origin-when-cross-origin では、クロスオリジン遷移時はオリジンだけに切り詰められ、HTTPS から HTTP への遷移では送られません。Referrer-Policy: no-referrer、ブラウザのプライバシー設定、拡張機能、ブックマークやアドレスバーからの直接アクセスでも空になります。
つまり Referer による制御は、攻撃者には簡単に偽装される一方で、正規の利用者は理由なく弾かれるという、セキュリティと利便性の両方で不利な仕組みです。
Refererで閲覧を制限してはいけない理由
サーバー側の Referer チェックも認可にはならない
サーバー側で Referer を見る実装(.htaccess の RewriteCond %{HTTP_REFERER} 等)も、同じ理由で認可にはなりません。ただし、画像の直リンク抑止のような「負荷対策」用途は、セキュリティ境界ではないと理解したうえで使われることがあります。
CSRF 対策の補助として Origin/Referer を検証するのは別の目的(送信元の妥当性確認)であり、トークン方式などと組み合わせる前提で OWASP でも言及されます。この項目が問題にするのは「誰が閲覧してよいか」の判定に使うケースです。
要件の根拠
| 出典 | 内容 |
|---|---|
| OWASP ASVS 5.0.0 V8.3.1 | 認可を信頼できるサービス層で強制し、利用者が操作できる制御に依存しない |
| OWASP ASVS 5.0.0 V8.2.1 | 機能単位のアクセス制限 |
| CWE-293 | Referer フィールドを認証に使う弱点 |
| CWE-602 | サーバー側のセキュリティをクライアント側で強制する弱点 |
| OWASP WSTG-ATHN-04/WSTG-ATHZ-02 | 認証方式・認可方式の迂回テスト |
よくある誤解
- 「Referer はブラウザで書き換えられないから安全」:ブラウザ経由でなければ自由に送れます。保護対象を取得するのに正規のブラウザを使う必要はありません。
- 「ログイン画面からしかリンクしていないから URL は知られない」:URL はブラウザ履歴、アクセスログ、共有されたリンク、検索エンジンのクロールで漏れます。
Web Storage の値で「ログイン済み」とみなす実装は「クライアント保存値を認証判定に使っていない」、Cookie や Referer を偽装したときに見える範囲が増えないかの実地確認は「Cookie・Referer偽装でアクセス範囲が増えない」で扱います。
Refererをアクセス制御に使っていないの診断基準(セキュリティAIチェッカー)
取得対象
- 診断対象URL(最終URL)のトップページHTML 1件(インラインスクリプトを含む)。外部JSは取得しません。追加通信はありません。
- サーバー側で HTTP Referer を検査しているかは、受動的な取得では観測できません。Cookie・Referer 偽装による差分は「Cookie・Referer偽装でアクセス範囲が増えない」が別途確認します。
判定に使う条件
HTML中に、次の3要素がこの順で近接して現れるかを、大文字小文字を区別せずに調べます。
document.referrer- その後160文字以内に、比較・照合を表す語(
indexOf、includes、startsWith、endsWith、match、search、test、==/===/!=/!==) - さらに300文字以内に、遷移または認証を表す語(
location = …、location.href = …、location.replace(、location.assign(、login、signin、auth、ログイン、認証、許可)
document\s*\.\s*referrer[\s\S]{0,160}?(?:indexOf|includes|startsWith|endsWith|match|search|test|===?|!==?)[\s\S]{0,300}?(?:location(?:\s*\.\s*href)?\s*=(?!=)|location\s*\.\s*(?:replace|assign)\s*\(|login|signin|auth|ログイン|認証|許可)
判定条件
| 判定 | 条件 | 根拠表示 |
|---|---|---|
| ○ 問題なし(pass) | 一致なし | 取得HTML内にRefererゲートの兆候は確認されません。 |
| △ 要確認(warn) | 上記に一致(参照元を比較し、その結果で遷移・認証処理を行う兆候) | document.referrerを遷移・認証条件に使う兆候があります。 |
| × 要改善(fail) | この項目では使用しない | ― |
| 対象外(na) | この項目では使用しない | ― |
近接条件を設けているのは、アクセス解析タグが document.referrer を単に送信する({ref: document.referrer})ケースや、「戻る」ボタンのための参照など、アクセス制御と無関係な利用を△にしないためです。静的検査では実際の制御効果を断定できないため、一致時も×ではなく△(要確認)とします。
得点への影響
重み5の critical 項目です。○は5点、△は2.25点(5×0.45)、×は0点。対象外は分母から除外されます。
自治体サイトでの判定例
| HTML の記述 | 判定 |
|---|---|
if (document.referrer.indexOf("/login.htm") == -1) { location.href = "/"; } | △ |
var r = document.referrer; if (!r.includes("city.example.lg.jp")) { alert("不正なアクセス"); location.replace("index.html"); } | △ |
navigator.sendBeacon("/log.php", JSON.stringify({ref: document.referrer})) | ○(比較・遷移が無い) |
document.referrer を使わない | ○ |
検出の限界
- 外部JS内の判定、変数を経由して離れた位置で比較する実装、サーバー側の
HTTP_REFERER判定は、この項目では検出しません。○は「トップページHTMLに兆候が無い」ことを示すだけです。 - 逆に、解析タグなどで
document.referrerの直後(合計約460文字以内)にsearch・test・==などの語とlogin・auth・location =などの語が偶然並ぶと、アクセス制御と無関係でも△になり得ます。△の場合は該当スクリプトを読み、参照元の比較結果で表示可否を決めているかを確認してください。
手動確認の手順
# Referer 無しで保護ページが返るか
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.lg.jp/limited/page.htm
# Referer を偽装すると返るか(返るならサーバー側 Referer 判定の疑い)
curl -s -o /dev/null -w "%{http_code}\n" -H "Referer: https://www.example.lg.jp/limited/login.htm" https://www.example.lg.jp/limited/page.htm
どちらも200で本文が返る場合、ブラウザ内の Referer 判定は意味を持っていません。2つ目だけ200の場合はサーバー側 Referer 判定であり、同様に偽装可能です。
Refererでアクセス制御しているとどんなリスクがあるか
攻撃シナリオ
- 攻撃者が限定公開ページのソースから
document.referrer判定と遷移先を読み取る。 - 保護対象URLを直接
curlで取得するか、Referer を偽装して取得する。 - 研修資料、内部連絡、名簿、入札関連の事前資料などが閲覧・転載される。
想定される被害
- 非公開情報の漏えい、個人情報が含まれる場合の漏えい等報告対応
- 「リンク元を限定しているので安全」という誤認による長期間の放置
- 正規利用者がブックマークやプライバシー設定のために閲覧できない業務上の支障
Refererに頼らないアクセス制御の設定方法(Apache・nginx・IIS・Next.js)
基本方針
- 閲覧可否は、サーバー側で認証済みセッションを検証して決める(ASVS V8.3.1)。
- Referer・
document.referrerによる判定は削除する。残す場合も「表示上の案内」に限定し、セキュリティ機能として扱わない。 - 公開してよい情報か、認証が必要な情報かを最初に区別する。一般公開して問題ない資料なら、そもそも制御を外すのが最も確実です。
Apache(.htaccess)— Referer 判定をやめ、認証を掛ける
# 誤った例(削除する)
# RewriteCond %{HTTP_REFERER} !^https://www\.example\.lg\.jp/ [NC]
# RewriteRule \.(?:htm|pdf)$ - [F]
# 最小限の代替:Basic 認証(HTTPS 必須)
AuthType Basic
AuthName "Restricted"
AuthUserFile /home/example/.htpasswd
Require valid-user
Basic 認証は HTTPS 上でのみ使い、利用者ごとのアカウント発行と退職時の削除を運用に組み込みます。業務システムとしては、アプリケーション側のセッション認証や SSO の利用が望まれます。
nginx
location /limited/ {
auth_request /auth/check; # アプリでセッションを検証
error_page 401 = /login;
}
valid_referers ディレクティブ(ngx_http_referer_module)は、公式ドキュメントでも「Referer は容易に偽装できるため、目的は完全な遮断ではなく、通常のブラウザからの大量リクエストの抑止」と説明されており、認可には使いません。
IIS
「URL 書き換え」で {HTTP_REFERER} を条件にした拒否ルールは認可にならないため、対象フォルダーに Windows 認証またはフォーム認証を設定し、匿名認証を無効にします。
Next.js(Vercel)
// app/limited/[slug]/page.tsx(抜粋)
import { cookies } from "next/headers";
import { redirect } from "next/navigation";
import { verifySession } from "@/lib/session"; // サーバー側でセッションストアと照合
export default async function Page() {
const sid = (await cookies()).get("__Host-sid")?.value;
if (!sid || !(await verifySession(sid))) redirect("/login");
// 認可済みのときだけコンテンツを描画
}
headers().get("referer") で分岐する実装は避けます。
CMS
限定公開機能(会員ページ、パスワード保護、イントラ専用公開)を使い、テーマのJavaScriptで参照元を見る仕組みは削除します。添付ファイルの直接URLにも同じ保護が掛かるかを確認してください。
サイトを壊さないためのガードレール
- Referer 判定を削除するだけで認証を追加しないと、ページが完全公開になります。必ず「代替の認証を有効化 → 動作確認 → 旧判定を削除」の順で進めます。
- 「Referrer-Policy」は情報漏えい防止のための設定であり、この項目の対策ではありません。
設定後の確認方法
# 未認証では 302/401/403 のいずれかになること
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.lg.jp/limited/page.htm
# Referer を偽装しても結果が変わらないこと
curl -s -o /dev/null -w "%{http_code}\n" -H "Referer: https://www.example.lg.jp/" https://www.example.lg.jp/limited/page.htm
よくある質問(FAQ)
Refererはブラウザで書き換えられないので、アクセス制御に使っても安全ではありませんか?
安全ではありません。Refererはブラウザ上のスクリプトからは設定できない禁止ヘッダーですが、curl -H "Referer: ..." やプロキシツールでは任意の値を送れます。保護対象の取得に正規のブラウザを使う必要はありません。
ログイン画面からしかリンクしていないページなら、URLは知られないのでは?
URLはブラウザ履歴、アクセスログ、共有されたリンク、検索エンジンのクロールで漏れます。リンク元を限定しても、URLを知った人は直接アクセスできます。
画像の直リンク防止にRefererを使うのも問題ですか?
画像の直リンク抑止のような負荷対策の用途は、セキュリティ境界ではないと理解したうえで使われることがあります。nginxの公式ドキュメントも、valid_referersの目的は完全な遮断ではなく通常のブラウザからの大量リクエストの抑止だと説明しています。この項目が問題にするのは、誰が閲覧してよいかの判定に使うケースです。
CSRF対策でOriginやRefererを確認するのも同じ問題ですか?
目的が異なります。CSRF対策の補助としてOrigin・Refererを検証するのは送信元の妥当性確認であり、トークン方式などと組み合わせる前提でOWASPでも言及されます。閲覧可否の判定(認可)に使うこととは別です。
Refererをアクセス制御に使っていないかの診断で△になったら、必ずRefererで制限していますか?
必ずではありません。document.referrerの直後に比較の語と遷移・認証の語が偶然並ぶと、アクセス制御と無関係でも△になり得ます。該当スクリプトを読み、参照元の比較結果で表示可否を決めているかを確認してください。
Referrer-Policyを設定すれば、Refererをアクセス制御に使う問題の対策になりますか?
なりません。Referrer-Policyは遷移先へ送るURL情報を減らす情報漏えい防止の設定です。この項目の対策は、サーバー側で認証済みセッションを検証して閲覧可否を決めることです。
この項目を含む127項目を、URLを入れるだけで無料診断します。
参考資料
- CWE-293: Using Referer Field for Authentication
- MDN Referer
- OWASP ASVS 5.0.0 V8 Authorization
- OWASP WSTG-ATHN-04 Testing for Bypassing Authentication Schema
- OWASP WSTG-ATHZ-02 Testing for Bypassing Authorization Schema
- nginx Module ngx_http_referer_module
- nginx Module ngx_http_auth_request_module
- IPA「安全なウェブサイトの作り方」