玄関の鍵を閉めたはずなのに…「HTTPヘッダーインジェクション」という見えない泥棒の話
こんにちは。セキュリティの世界で「盾」を握り続けている者です。
今日は、開発現場でつい見落とされがちな「HTTPヘッダーインジェクション」と「レスポンス分割攻撃」について、少しお話しさせてください。「難しそう…」と身構える必要はありません。まずは身近な「家の防犯」に例えて、この攻撃が何をしようとしているのか、一緒に紐解いていきましょう。
1. そもそも、HTTPヘッダーって何?
Webサイトにアクセスするとき、ブラウザとサーバーは裏側で「名刺交換」をしています。これがHTTPヘッダーです。
- ブラウザ(あなた): 「こんにちは、このページを見せて。あ、僕のブラウザはChromeだよ」
- サーバー(家主): 「はい、どうぞ。このページはここにあるよ。ちなみにこれはHTML形式のデータね」
この「名刺」の中には、ページの種類や、ログイン状態の管理(クッキー)など、サイトを正しく動かすための重要な情報が書かれています。
2. 「泥棒」はどこから侵入するのか?
HTTPヘッダーインジェクションは、「名刺の余白に勝手に書き込みをする」ような攻撃です。
例えば、WebサイトのURLに「ユーザー名」を表示する機能があるとします。
example.com/welcome?name=田中
サーバーはこの「田中」という文字を、名刺の「お名前欄」に書き込んで返します。
ところが、もしここに悪意のある人が 「改行コード(\r\n)」 という特殊な記号を混ぜたらどうなるでしょうか?
「田中」の後に改行を入れ、さらに続けて「偽の指示」を書き込むのです。
- 本来の返信:
Set-Cookie: user=田中 - 攻撃後の返信:
Set-Cookie: user=田中
Set-Cookie: admin=true (←ここが勝手に追加された偽の指示!)
これが「レスポンス分割攻撃」の正体です。ブラウザは「ああ、このサーバーは『あなたは管理者ですよ』と指示しているんだな」と騙され、偽の権限を与えてしまいます。家の鍵を閉めたつもりなのに、玄関の隙間から「合い鍵」を投げ込まれるようなものです。
3. どうやって防げばいいの?(対策の基本)
一歩ずつ対策を学んでいきましょう!守り方は大きく分けて2つあります。
① 「ユーザーの入力値」を絶対に信用しない
一番の対策は、ユーザーから送られてきたデータに「改行コード」が含まれていたら、「それは名刺に書いちゃダメ!」と厳しく弾くことです。
例えば、PHPであればこんな風にチェックします。
// ユーザーからの入力を受け取る
$name = $_GET[‘name’];
// 改行コード(\r または \n)が含まれていないかチェック
if (preg_match(“/[\r\n]/”, $name)) {
// 悪意のある入力とみなして処理を中断する
die(“不正な入力です。”);
}
// 安全な値だけをヘッダーにセットする
header(“X-User-Name: ” . $name);
このように、「改行という危険な道具を玄関に入れない」というフィルタリングが非常に重要です。
② フレームワークの機能を使い倒す
最近のWebフレームワーク(Laravel, Express, Djangoなど)は、とても優秀です。ヘッダーをセットする際、自動的に改行コードを検知してエラーを出してくれたり、適切に変換してくれたりする機能が備わっています。
「自作の関数でヘッダーを操作する」のは、鍵を自分で削って作るようなもの。フレームワークが用意してくれた「規格品の安全な鍵」を使いましょう。
4. 最後に:セキュリティは「疑うこと」から始まる
セキュリティ対策とは、完璧な防御壁を築くことではなく、「誰かが悪意を持って隙間を狙っているかもしれない」と想像することから始まります。
HTTPヘッダーへの書き込みは、サーバーとブラウザの間の「信頼関係」を悪用する卑劣な手口です。でも、今日お話しした「入力値のチェック」と「フレームワークへの信頼」という2つの基本さえ守れば、怖がる必要はありません。
皆さんが書くコードが、誰かの大切な情報を守る「堅牢な扉」になりますように。応援しています!
コメント