Referrer-Policy: リファラー情報の漏洩を防ぐ
これは何?
Referrer-Policyは、ブラウザが別のサイトへ遷移する際に送信する「Referer」ヘッダ(参照元URL)の情報量を制御するHTTPレスポンスヘッダです。このヘッダを適切に設定することで、機密情報を含むURLが外部サイトに漏洩することを防ぎます。
「Referer」は本来「Referrer」とスペルすべきですが、HTTP仕様の初期に誤って「Referer」と記載されたため、HTTPヘッダ名は誤った綴りのまま標準化されています。ただし、Referrer-Policy(ポリシー名)は正しい綴りで統一されています。
ブラウザはデフォルトで、ユーザーがリンクをクリックした際、遷移先のサーバーに「どのページから来たか」という情報(Refererヘッダ)を送信します。これはアクセス解析やセキュリティ対策に有用ですが、URLにセッションIDやトークンが含まれている場合、重大な情報漏洩につながります。
なぜ重要なのか
Referrer-Policyを設定しないと、以下のような機密情報が外部サイトに漏洩する危険性があります:
URLパラメータにトークンが含まれるケース:
https://example.com/reset-password?token=abc123xyz
このページから外部サイトのリンクをクリックすると、Refererヘッダにパスワードリセットトークンが含まれてしまいます。
検索クエリの漏洩:
https://medical-site.com/search?q=治療法+病名
医療サイトの検索結果ページから広告リンクをクリックすると、広告主に検索キーワード(病名など)が送信されます。
セッションID の漏洩:
https://example.com/dashboard;jsessionid=A1B2C3D4E5
古いWebアプリケーションでは、セッションIDがURLに含まれることがあり、外部リンクから簡単に盗まれる危険があります。
HTTPS→HTTPへの遷移: セキュアなHTTPSページから非セキュアなHTTPページに遷移する際、Refererヘッダが平文で送信され、ネットワーク上で盗聴される可能性があります。
攻撃の仕組み
Referrer情報の漏洩を悪用した攻撃シナリオ:
- トークン窃取攻撃: 攻撃者は、パスワードリセットメールに含まれるリンクを受け取ったユーザーが、リセットページから外部リンクをクリックすることを期待します
被害者: reset-password?token=secret123 ページを開く
↓
外部リンク(攻撃者のサイトまたは広告)をクリック
↓
攻撃者のサーバー: Referer: https://victim.com/reset?token=secret123 を受信
↓
攻撃者: トークンを使って被害者のパスワードを変更
-
検索履歴の収集: 広告ネットワークや外部スクリプトが、Refererヘッダから検索キーワードを収集し、プロファイリングに利用します
-
セッションハイジャック: URLにセッションIDが含まれるレガシーシステムで、外部サイトがRefererヘッダからセッションIDを取得し、なりすましログインを試みます
-
イントラネット情報の漏洩: 社内ネットワークのURLスキーム(
http://intranet.company.local/confidential-project/)が外部サイトに送信され、内部構造が露見します
実際の被害事例
Facebookのアクセストークン漏洩(2018年): Facebookの一部機能で、アクセストークンを含むURLから外部サイトへのリンクをクリックすると、Refererヘッダ経由でトークンが漏洩する問題が発見されました。攻撃者はこのトークンを使い、被害者のアカウントにアクセス可能でした。
GitHubのプライベートリポジトリURL漏洩(2020年): GitHubのプライベートリポジトリページから外部画像を参照した際、RefererヘッダにリポジトリのURLが含まれ、本来非公開であるリポジトリの存在が外部に知られる問題が報告されました。
医療サイトの検索履歴漏洩(2019年): 複数の医療情報サイトで、病名や症状の検索結果ページから広告リンクをクリックすると、検索キーワードが広告主に送信されていることが判明。プライバシー団体から批判を受けました。
パスワードリセットトークンの漏洩(多数): 様々なWebサービスで、パスワードリセットページから外部リンク(ヘルプページ、外部サポートサイト等)をクリックした際、トークンが漏洩する脆弱性が報告されています。
Nyambushでの検出内容
Nyambushのセキュリティヘッダスキャンでは、以下の項目をチェックしています:
- Referrer-Policyヘッダの有無: ヘッダが設定されているか
- 設定値の妥当性: 有効なポリシー値が使用されているか
- 推奨設定:
strict-origin-when-cross-originまたはno-referrerが設定されているか - 複数値のサポート: カンマ区切りで複数のポリシーが指定されている場合、ブラウザが理解できる最初の値を使用
- meta タグとの整合性: HTMLの
<meta name="referrer">タグと矛盾していないか
スキャン結果では、未設定または弱い設定(unsafe-urlなど)の場合に警告を表示し、推奨設定を提案します。
対策方法
各ポリシー値の説明
| ポリシー値 | 説明 | セキュリティレベル |
|-----------|------|------------------|
| no-referrer | Refererヘッダを一切送信しない | 最高 |
| no-referrer-when-downgrade | HTTPS→HTTPの場合のみRefererを送信しない(デフォルト) | 低 |
| origin | オリジン(スキーム+ホスト+ポート)のみ送信 | 中 |
| origin-when-cross-origin | 同一オリジンには全URL、クロスオリジンにはオリジンのみ | 中 |
| same-origin | 同一オリジンにのみRefererを送信 | 高 |
| strict-origin | オリジンのみ送信、HTTPS→HTTPでは送信しない | 高 |
| strict-origin-when-cross-origin | 同一オリジンには全URL、クロスオリジンにはオリジンのみ、HTTPS→HTTPでは送信しない | 推奨 |
| unsafe-url | 常に全URLを送信(非推奨) | 最低 |
Apache (.htaccess または httpd.conf)
# 推奨設定: バランスの取れたポリシー
Header always set Referrer-Policy "strict-origin-when-cross-origin"
# より厳格な設定(アクセス解析に影響あり)
Header always set Referrer-Policy "no-referrer"
# 同一オリジンのみ許可
Header always set Referrer-Policy "same-origin"
Nginx
# 推奨設定
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# 複数のポリシーをフォールバックとして指定
add_header Referrer-Policy "no-referrer, strict-origin-when-cross-origin" always;
Next.js (next.config.js)
module.exports = {
async headers() {
return [
{
source: '/:path*',
headers: [
{
key: 'Referrer-Policy',
value: 'strict-origin-when-cross-origin',
},
],
},
];
},
};
Express.js
const helmet = require('helmet');
// helmetのデフォルト設定を使用
app.use(helmet.referrerPolicy({ policy: 'strict-origin-when-cross-origin' }));
// または手動設定
app.use((req, res, next) => {
res.setHeader('Referrer-Policy', 'strict-origin-when-cross-origin');
next();
});
WordPress (functions.php)
function add_referrer_policy() {
header('Referrer-Policy: strict-origin-when-cross-origin');
}
add_action('send_headers', 'add_referrer_policy');
HTML meta タグ(個別ページで設定)
<head>
<meta name="referrer" content="strict-origin-when-cross-origin">
</head>
ページごとに異なるポリシーを適用
// Next.js App Router: メタデータで設定
export const metadata = {
other: {
'referrer': 'no-referrer', // 機密ページでは厳格に
},
};
特定のリンクのみRefererを無効化
<!-- 個別のリンクでRefererを送信しない -->
<a href="https://external-site.com" rel="noreferrer">外部リンク</a>
まとめ
Referrer-Policyは、URLに含まれる機密情報の漏洩を防ぐために不可欠なセキュリティヘッダです。特に、認証トークンやセッションIDをURLパラメータで扱うシステムでは必須の対策となります。
推奨設定:
- 一般的なサイト:
strict-origin-when-cross-origin(バランスが良い) - 機密性の高いサイト:
no-referrerまたはsame-origin(最も安全) - 避けるべき:
unsafe-url,no-referrer-when-downgrade(情報漏洩リスク)
追加のベストプラクティス:
- URLにトークンやセッションIDを含めない(POSTまたはヘッダで送信)
- 外部リンクには
rel="noreferrer noopener"を追加 - アクセス解析への影響を考慮し、段階的に導入
Nyambushのスキャンで現在の設定を確認し、適切なポリシーを選択しましょう。機密情報の漏洩は一度発生すると取り返しがつきません。今すぐ対策を実施することが重要です。