「お問い合わせフォームを作ったから、これで安心!」……そう思っていませんか?
実はそのフォーム、泥棒に「勝手に家中の合鍵を作らせて、好きな場所に郵便物を送りつけさせる」ような大きな隙があるかもしれません。
今回は、エンジニアの誰もが一度は通る道でありながら、見落とすと会社に多大な迷惑をかけてしまう「メールヘッダーインジェクション」について、現場の視点から紐解いていきましょう。
—
1. メールヘッダーインジェクションって、何が悪いの?
まず、身近な例で考えてみましょう。あなたは手紙を出すとき、封筒に「差出人」や「宛先」を書きますよね。メールも同じで、プログラムがメールサーバーに「誰に送るか」「件名は何か」を伝えるための「ヘッダー」という情報を持っています。
攻撃者は、お問い合わせフォームの「お名前」や「件名」の入力欄に、本来そこには書くはずのない特別なコマンドを忍び込ませます。
泥棒のやり口(メカニズム)
例えば、入力欄に普通なら「佐藤」と入れるところに、攻撃者はこう書き込みます。
佐藤\r\nBcc: victim@example.com
\r\n というのは、「ここで改行して、新しい行を始めるぞ」という合図です。メールシステムはこれを見て、「あ、次の行から『Bcc』の指示があるんだな」と勘違いしてしまいます。
結果、あなたが意図しない第三者(victim@example.com)にもメールが送信されてしまい、あなたのサーバーが「スパムメールの踏み台」として悪用されることになるのです。最悪の場合、あなたのサーバーからのメールが世界中からブロックされ、二度と届かなくなることもあります。
—
2. 家の鍵を「二重ロック」にする考え方
では、どう防げばいいのでしょうか。結論から言えば、「ユーザーの入力をそのままメール送信プログラムに渡さない」こと、これに尽きます。
防犯と同じで、鍵をかける場所を間違えてはいけません。
対策の基本:入力値を「無害化(サニタイズ)」する
プログラムが「改行コード(\r や \n)」を見つけた瞬間に、「おっと、これは悪意ある命令かもしれないから削除しよう」と判断させる仕組みを作ります。
PHPを例に、安全な書き方を見てみましょう。
—
3. なぜ「バリデーション」が必要なのか?
先ほどの「無害化」も大切ですが、もっと根本的な対策があります。それは「そもそも変な値は受け取らない」という防衛策です。
- 文字数制限を設ける: お名前欄に500文字も必要ですか?短く制限するだけで攻撃の難易度は上がります。
- 禁止文字をチェックする: もし改行が必要ない項目なら、改行が含まれていた時点でエラーにして処理を中断させるのが一番安全です。
「信頼できない入力値には必ず触れる」というスタンスを、コードを書くたびに思い出してください。
—
4. 最後に:セキュリティは「完璧」を目指さない
セキュリティの世界には「絶対」という言葉はありません。しかし、「攻撃者が嫌がる仕組み」をコツコツ積み上げることはできます。
- メール送信ライブラリを使う: PHPの
mail()関数を直接叩くのではなく、PHPMailerやSymfony Mailerといった、実績のあるライブラリを使いましょう。これらは、ヘッダーインジェクション対策が内部でしっかり施されています。 - ログをとる: 誰が、いつ、どんな内容を送信したか。これを残しておくだけで、万が一の時に「何が起きたか」をすぐに突き止められます。
セキュリティは、鍵をかける面倒な作業ではありません。「あなたが作った大切なプログラムを、泥棒から守るための最後の一手間」です。
今日から一つずつ、あなたのコードに「改行コードへの警戒」という名の鍵をかけていきましょう。もし分からないことがあれば、またいつでも聞きに来てくださいね。一緒に安全なシステムを作り上げていきましょう!
コメント