玄関の鍵をかけたはずが、裏口から「手紙」が書き換えられている?メールヘッダインジェクションの正体
こんにちは!セキュリティの世界へようこそ。
システム開発をしていると、「お問い合わせフォーム」や「パスワードリセットメール」といったメール送信機能を実装することは避けて通れませんよね。
でも、ちょっと待ってください。あなたが書いたそのコード、「泥棒に玄関の鍵を開けさせるような隙」が隠れていませんか?
今日は、メール送信の裏側でこっそり悪用される「メールヘッダインジェクション」という攻撃について、一緒に紐解いていきましょう。
—
そもそも「メールヘッダインジェクション」って何?
例え話から始めましょう。あなたが家から手紙を出すとき、封筒の宛名(To)や差出人(From)を書きますよね。
メールも同じで、サーバーに対して「宛先はここ!件名はこれ!」という指示書(メールヘッダ)を送ります。攻撃者は、この指示書の「改行」を悪用して、勝手に別の指示を書き加えてしまうんです。
「改行」がなぜ武器になるの?
メールの仕組みにおいて、一行(ヘッダ)の終わりは「改行」で区切られています。
もし、攻撃者が入力フォームの名前に「田中\r\nBcc: 悪意あるアドレス@example.com」と入力したらどうなるでしょう?
サーバーはこう読み取ります。
1. お名前:田中
2. (改行)
3. Bcc: 悪意あるアドレス@example.com ← ここで勝手にコピーが送信される!
つまり、本来の宛先だけでなく、攻撃者が指定したアドレスへこっそりメールを転送させる「裏口」を作られてしまうわけです。これがメールヘッダインジェクションの恐ろしい仕組みです。
—
泥棒はどうやって侵入してくる?(攻撃のメカニズム)
例えば、お問い合わせフォームの「お名前」欄を、そのままメールの From ヘッダに組み込んでいるコードがあるとします。
// 悪い例:ユーザーの入力をそのままヘッダに使うと危険!
$name = $_POST[‘name’];
$headers = “From: ” . $name . “\r\n”; // ここで改行コードを入れられたらアウト!
mail($to, $subject, $message, $headers);
攻撃者はここに \r\n (キャリッジリターンとラインフィード、つまり改行コード)を混ぜることで、ヘッダの領域を無理やり拡張します。これを防がないと、あなたのサーバーが「スパムメールの踏み台」として利用され、ブラックリスト入りしてしまうことも珍しくありません。
—
防御の鉄則:玄関を「二重ロック」しよう
では、どうすれば防げるのでしょうか?対策はシンプルですが、徹底することが何より重要です。
1. 入力値の「改行」を徹底的に排除する
一番の基本は、「ヘッダに使うデータには絶対に改行を含めない」ことです。プログラムがデータを受け取った直後に、改行が含まれていないかチェックしましょう。
// 良い例:改行コードが含まれていたらエラーにする
$name = $_POST[‘name’];
// 改行コード(\r や \n)が含まれていないかチェック
if (preg_match(“/(\r|\n)/”, $name)) {
die(“不正な入力です。”);
}
// これで安心!
$headers = “From: ” . $name . “\r\n”;
2. できるだけライブラリに頼る(賢い選択)
最近の言語やフレームワーク(PHPのPHPMailerやLaravelのMailクラスなど)には、ヘッダインジェクションを自動で防ぐ仕組みが組み込まれています。
「自分でヘッダを組み立てる」のは、もう古いし危ないのです。
信頼できるライブラリを使い、最新の状態にアップデートしておくこと。これが、最新のセキュリティ防犯カメラを設置するのと同じくらい重要です。
—
まとめ:セキュリティは「疑う」ことから始まる
メールヘッダインジェクションは、基本を押さえていれば必ず防げる攻撃です。
- ユーザーの入力は「泥棒の道具」かもしれないと疑う。
- 改行コードという「扉」を勝手に作らせない。
- 先人の知恵(最新のライブラリ)を借りて、安全な実装を行う。
最初は難しく感じるかもしれませんが、こうして「仕組み」を理解するだけで、あなたの書くコードは格段に強固になります。一つずつ、一緒に学んでいきましょう!
もし、「自分のコードが大丈夫か不安だな…」と思ったら、まずは今日紹介した「改行チェック」から見直してみてくださいね。それが、あなたのシステムを守る最初の一歩になりますから。
コメント