2011-07-06 1 views
7

私は自分のサイトにPHPによるHTMLの連絡フォームを持っています。現在私はPHP mail()関数を使用しています。そのため、email header injection attacksを避けるために、多くのユーザー入力の検証を行う必要があります。私は安全だと思いますが、おそらく何か忘れてしまいました。私は確固たるPHPメールライブラリに移行したいと思っています。私が選択したライブラリはSwiftmailerです。Swiftmailerを使用してPHP駆動のHTMLコンタクトフォームを安全にする方法は?

今私はではSwiftMailerは以下に取り組むかどうかを確認したい:

  1. は削除または送信者名に<>文字をエスケープ。
  2. 送信者名から改行(\n\r\n ...)を削除します。
  3. 電子メールの件名から改行を削除またはエスケープします。
  4. メッセージ本文(メールの内容)の改行を正規化します。 PHPドキュメントによると、内容には\n、メールヘッダのセパレータには\r\nを使用する必要があります。

PS:私はここで試しているので、私は成功していない私の質問をSwiftmailerチームに連絡しようとしました。

編集:

私はではSwiftMailerでいくつかのテストケースを行なったし、これは私がこれまでに見つけたものです:

  1. あなたは、送信者の名前で<または>を持っている場合は、あなたが得ますa 配送不能メールエラーメール。これはメールサーバーのDOS attackに多少なりとも(多分私は間違っています)。これは正常ですか?
  2. 改行がエスケープされ、注入攻撃が失敗します。
  3. 改行がエスケープされ、注入攻撃が失敗します。
  4. テスト済みですが、私はSwiftmailerが何をしているかを見ることができません。だから私はまだここで暗闇の中にいる。

誰かが#1と#4を明確にすることはできますか?正常な動作であるかどうかはわかりません。

+6

あなたは常に、コードに目を通すことができます...結局のところ、Swiftmailerは単なるPHPスクリプトです。あなたがこの脆弱性を否定するなら、外部のライブラリをどうにか監査したいと思うでしょう。 –

+2

'リクエストデータの内容を取り除かずにヘッダインジェクション攻撃から保護する'(ホームページから)、コードをざっとスキャンして、有効ではないものを渡すと、静かな受け入れではなく例外が発生すると思います。 – hakre

+1

\ nと\ rを任意のユーザが提出したヘッダとwordwrap($ message、70)から取り除く限り、あなたは大丈夫でしょう。送信者名から< and >を取り除くとどうなりますか?私はこれらの文字があなたにどのようなタイプのハックを開いているか知ることに非常に興味があります。どんな情報でも大歓迎です。 – dqhendricks

答えて

1

EDIT:この回答は廃止されている可能性があります。私がこれを書いたとき、SwiftMailerライブラリにはいくつかの問題がありました。この時点では、すべてがSwiftMailerで正常に動作しており、より多くのライブラリを提供するより良いライブラリとみなされ、PHPMailerよりも優れています。

私はあなたがphpmailerの使用をお勧めします。私が今までに使った中で最も安定した郵送図書館の一つです。

include("./phpmailer/class.phpmailer.php"); 
$mail = new PHPMailer(false); // the true param means it will throw exceptions on errors, which we need to catch 
$mail->IsSMTP(); 
$mail->Host = "YourDomainName.com"; 
$mail->SMTPDebug = 2; 
$mail->SMTPAuth = true; 
$mail->SMTPSecure = "tls"; 
$mail->Host = "YourSMTPMailServer.com"; 
$mail->Port = 587; 
$mail->Username = "[email protected]"; 
$mail->Password = "password"; // GMAIL password 
$mail->AddAddress("[email protected]", '<< >> ! " Receiver Name'); 
$mail->SetFrom('[email protected]', '<< >> ! " Sender Name'); 
$mail->Subject = "A testing subject"; 
$mail->AltBody = 'To view the message, please use an HTML compatible email viewer!'; 
$mail->MsgHTML('This is my <b>html</b> testing email, sent '.time()); 
$mail->Send(); 

あなたのメールサーバーに接続するように設定する必要がありますが、動作するはずです。 Phpmailerはこれまで私が試したすべてをエスケープします。チェックしているのは「[email protected]」だけです。私はこのコードでそれを行う:

$email = "[email protected]"; 
$email = filter_var(filter_var($email,FILTER_SANITIZE_EMAIL),FILTER_VALIDATE_EMAIL); 

if($email){ 
    echo "This email is valid!"; 
} else { 
    echo "This email is INVALID!"; 
} 

私はこれが役に立てば幸い:)

+2

ええ、私はそれを数年使ったので、PHPMailerをとてもよく知っています。私はちょうどこれがいかに働くか気に入らない。ドキュメント/チュートリアルは、独自のウェブサイトから時代遅れです。私はそれがFabien Potencier/symphonyによって支えられているので、Swiftmailerを好むだけです。 – AlexV

+0

@AlexV私はいつもSwiftMailerを使用しています - これまでのところユーザー名/電子メールを事前に検証していますが、これまでのところ問題はありません。このような '<>'文字はメーラーに届くまでに長時間削除されます。 – LazyOne