PHP フォームが悪用されて、フォームの送信先から電子メールが送信されていると聞いたことがあります。これは実際の問題ですか? もしそうなら、どうすれば修正できますか? SQL インジェクションの防止に似ていますか?
2 に答える
メール インジェクションのセキュリティの脆弱性について話しているのです。たとえばmail()
、次のコード サンプルのように関数にカスタム ヘッダーを渡している場合、脆弱です。
<?php
$additional_headers = "Reply-To: {$_GET['user_email']}";
mail($to, $subject, $message, $additional_headers);
?>
悪意のあるユーザーが自分のメールだけでなく、次のような追加のヘッダーも渡すと考えてください。
<?php
//$_GET['user_email'] = "me@example.net";// this is what you expect
// this is what you're getting actually
$_GET['user_email'] = "me@example.net\r\nBcc: someone@example.net, ...";
?>
次に、悪意のあるユーザーは、スパムに感染したと思われるメッセージのカーボン コピーを、サーバーから事実上無制限のユーザー リストに、あなたの名前で送信します。そうでなければ安全な特定の MIME ヘッダーを追加することで、この方法でメッセージを完全に自分のメッセージに置き換えることさえできます。これがどのような結果をもたらすか想像することしかできません!
解決策は簡単です。ユーザーから受け取るものは何も信用せず、受け取ったデータをフィルタリング/検証します。
入力が適切にフィルタリングされていない場合、どのフォームも脆弱です。それが電子メールフォーム、登録フォーム、またはPHPに裏打ちされているかどうかは関係ありません。
電子メールフォームの場合、電子メールを適切にサニタイズするためのPHPのフィルター関数を検討してください。
経験則として、FIFO(フィルター入力、エスケープ出力)を覚えておくことをお勧めします。
スーパーグローバルは、ほとんどダーティであり、フィルタリング(入力)が必要であると見なす必要があります。出力のエスケープは、コンテキストによって異なります。誰かに電子メールを送信する、データベースに挿入する、HTMLでレンダリングするなど、すべて異なる出力フィルタリング手法が必要です。