このコードが安全かどうか疑問に思っていたのですが、
$mail = mail($_POST['email'], 'foo' , 'foo');
RIPS によって安全でないと報告されました。
他の人がすでに言っているようにmail($_POST['email']...)
、ヘッダー インジェクション攻撃について考え始める前に、使用はいくつかの理由で安全ではありません。
POST 変数を「宛先」アドレスとして使用できるようにすることは、フォームを使用して誰にでもメールを送信できるため、安全ではありません。スパマーがメッセージを本文に入れることができなかったとしても、何千ものメッセージでメールボックスを爆破することにより、誰かを攻撃するために使用される可能性があります.
$_POST['email']
第二に、変数がサニタイズされているかどうかを示していません。メールアドレスとして使用する前に、有効なメールアドレスであることを確認してください。そうしないと、メーラーに悪影響を及ぼす可能性があります。幸いなことに、PHP にはメール検証機能が組み込まれています。
$sanitisedEmail = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
if(!$sanitisedEmail) {die('your email address is invalid');}
しかし、他のことは別として、ヘッダー インジェクション攻撃を回避したい場合は、PHP のmail()
関数を完全に使用しないようにする必要があります。組み込みmail()
関数は非常に基本的なものであり、ハッカーが悪用できる多くの弱点があります。phpMailerなどの高品質のラッパー ライブラリを使用する方がはるかに良いでしょう。
mail()
phpMailer の主な目的は、PHP での電子メールの送信をはるかに簡単にすることです。標準関数を使用するために必要な PHP コードは、ヘッダーや添付ファイルの追加を開始する必要がある場合、非常に複雑になる可能性があります。phpMailer を使用すると、これらすべてが非常に簡単になります。
さらに、これを使用すると、コードがより安全になります。phpMailer は必要なすべての入力サニタイズを行います。標準プロセスの一部として、電子メール アドレスを検証し、悪意のあるヘッダー攻撃を取り除きます。
それが役立つことを願っています。
Surely it's not secure and vulnerable to mail injection. Why do you ask?
SMTP protocol is very simple and very close to HTTP one.
It contains headers and each header separatted from another by a mere newline.
So, having $_POST['email'] equal to
foo@example.com
To: bar@example.com
your script will send 2 mails.
The same goes for almost every argument, including Subject.
Also, just like in HTTP, headers separated from the body by an empty line.
So, the attacker may also rewrite the body as well
To prevent that, just check user-entered fields ('cept for the body of course), for \n
and \r
characters.
悪意のあるユーザーはヘッダーを挿入することはできませんが、コンマで区切られた長い、長い、長いメール アドレスの文字列を渡し、あなたのサービスをスパム行為に利用することができます。
ユーザー入力データを関数 (または必要なもの) で使用する前に、常にチェックを実行する必要があります。