こんにちは!ネットワークの世界へようこそ。今日は、Web通信の「お作法」であるHTTPに潜む、ちょっと怖いけれど面白い「ヘッダーインジェクション」という攻撃手法について、一緒に紐解いていきましょう。
難しそうに聞こえるかもしれませんが、大丈夫。郵便配達の仕組みに例えれば、スッと頭に入ってきますよ。一歩ずつ、丁寧に見ていきましょう。
—
そもそもHTTPヘッダーって何だろう?
Webサイトを見るとき、ブラウザ(郵便の送り手)とサーバー(郵便の受け取り手)の間では、こんなやり取りが行われています。
1. ブラウザ: 「このページを見せて!あ、僕は日本語が読めるよ」
2. サーバー: 「わかった!じゃあ日本語のページを送るね」
この「僕は日本語が読めるよ」といった「付随情報」をまとめた場所、それがHTTPヘッダーです。封筒に貼る「速達」や「取扱注意」といった付箋のようなものですね。
「CRLF」という名の「改行」が招く悪夢
HTTP通信において、ヘッダーの終わりを告げるには特別な合図が必要です。それが「CRLF(キャリッジリターン・ラインフィード)」。要するに、キーボードの「Enterキー」を押したときの「改行コード」のことです。
郵便で例えるなら、「ここから先は中身(本文)ですよ」と区切るための「二重線」のようなものですね。
ヘッダーインジェクションの仕組み
もし、悪意ある誰かが、本来入力すべき場所に「改行」を混ぜ込めたらどうなるでしょうか?
例えば、ユーザー名を入力するフォームに、こんな細工をします。
`山田太郎%0D%0Aセットクッキー: 秘密のID=悪意ある値`
サーバーがこれをそのまま受け取ると、サーバーは「おっと、ここでヘッダーが終わって、次が本文だな」と勘違いしてしまいます。結果として、本来送るはずのない「偽のヘッダー」を、ブラウザに送りつけてしまうのです。これがヘッダーインジェクションの正体です。
—
どんな被害があるの?
この攻撃で狙われるのは、主に次の2つです。
1. レスポンス分割攻撃(HTTP Response Splitting)
サーバーから返ってくるはずの答えを、無理やり2つに分けます。前半は正常なページに見せかけて、後半に偽のサイトへの転送命令を混ぜる……なんてことが可能です。ユーザーを偽のログイン画面に誘導する手口ですね。
2. キャッシュ汚染
中間にあるキャッシュサーバー(Webの「中継基地」)に「このページはこういう内容だ」と嘘の情報を覚え込ませます。すると、次にアクセスした無実のユーザーまで、偽のページを見せられてしまう……という広範囲な被害に繋がります。
—
防御策:どうやって身を守ればいい?
「じゃあ、どう対策すればいいの?」と不安になりますよね。安心してください。現代のWeb開発では、「ユーザーからの入力を決して信用しない」のが鉄則です。
実践的なコード例(PHPでの対策)
もし皆さんがWebアプリを作っているなら、入力値に「改行コード」が含まれていないかチェックすることが最大の防御になります。
// ユーザーが入力した値を受け取る例
$username = $_GET[‘user_name’];
// 対策:改行コード(CR: \r または LF: \n)が含まれていないかチェックする
if (preg_match(“/[\r\n]/”, $username)) {
// 改行が含まれていたら、それは攻撃の可能性大!
// 処理を中断してエラーにする
die(“不正な入力です。”);
}
// ここまでくれば安全!ヘッダーにセットする
header(“X-User-Name: ” . $username);
—
まとめ:ネットワークの健康を守るために
ヘッダーインジェクションは、いわば「封筒の書き方ルールを悪用して、郵便局員を騙す行為」です。
1. ヘッダーは「付箋(ラベル)」であること。
2. 改行(CRLF)が境界線になっていること。
3. ユーザーの入力をそのままヘッダーに使わないこと。
この3つを意識するだけで、皆さんが作るWebサービスはグッと強固なものになります。
最初は複雑に見えるパケットの世界も、こうして「郵便配達」に例えると少し身近に感じられませんか?もし「もう少しここが知りたい!」という部分があれば、ぜひ教えてくださいね。一緒に学んでいきましょう!
コメント