11

ウェブサイトの簡単な連絡フォームを作成しています。データベースに接続せず、メールを送信するだけです。このコードは、スパマーがヘッダーインジェクションを使用するのを防ぎますか?私が見ていない脆弱性はありますか?

//create short variable names
$name= filter_var($_POST['Name'],FILTER_SANITIZE_STRING);
$email= filter_var($_POST['Email'],FILTER_SANITIZE_STRING, FILTER_VALIDATE_EMAIL);
$subject= filter_var($_POST['Subject'],FILTER_SANITIZE_STRING);
$message= filter_var($_POST['Message'],FILTER_SANITIZE_STRING);

//set up some static information
$toaddress = 'blah@localhost.com,blahblah@localhost.com';

$mailcontent = "Customer name: ".$name."\n".
            "Customer email: ".$email."\n".
            "Subject: ".$subject."\n\n".
            $message;

$fromaddress = "From:" . $email;

//invoke mail() function to send mail
mail($toaddress, "Website Contact Form",$mailcontent, $fromaddress);
?>
4

3 に答える 3

10

ヘッダーインジェクションは、ヘッダー変数に追加の改行を挿入できることに依存しています。これにより、文字列が新しいヘッダーのように見えます。

たとえば、の件名値を許可すると、次のようTesting\nCc: spamrecipient@example.com\n\nSome body textなメッセージヘッダーが作成されます。

Subject: Testing
Cc: spamrecipient@example.com

Some body text

つまり、悪用者は受信者を追加しただけでなく、独自の本文テキストも提供することができました。

ただし、あなたの場合、$toaddressは一定であり、$toaddressユーザーが指定した場合でも、関数によって正しくサニタイズされる必要がありmail()ます。

件名ヘッダーも同様に一定です

$message定義上、これは本文テキストであり、実際のヘッダーの後にのみ送信されるため、変数は安全です。

それは去るだけ$fromaddressであり、あなたはすでにFILTER_VALIDATE_EMAIL改行を含むものを拒否するはずのものを使用しています。

ただし、そのテストの結果を厳密にチェックし、結果がである場合はすべてを中止する必要がありFALSEます。検証が失敗した場合はmail()、空白のFrom:アドレスが指定されていると文句を言いますが、ヘッダーインジェクションの機会はありません。

私の知る限り、このコードは実際には安全です。


また、私見では、ユーザーが指定したメールアドレスからメールを送信しないでください。これは、SPFなどのスパム対策メカニズムに反することになります。

From:独自のドメインに属する定数値を使用する必要があります。必要に応じて、ヘッダーで正しくサニタイズされた値を使用Reply-Toして、後続の応答を目的のアドレスに簡単に送信できるようにすることができます。

于 2012-06-14T20:20:50.277 に答える
1

私見ですが、あなたのコードは安全ではありませ\r\n。と組み合わせて使用​​されたfilter_var()場合にのみ、それらを強制終了します。これにより、ASCII32未満の文字もすべて除外されます。FILTER_SANITIZE_STRINGFILTER_FLAG_STRIP_LOW

$message= filter_var($_POST['Message'], 
                     FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);

また、FILTER_VALIDATE_MAILtrueまたはfalseを返しますが、これも考慮されていません。PHPのメインマニュアルには情報が非常に不足しているため、この優れたソースを確認することをお勧めします。filter_var()


更新: Alnitakが指摘したよう\n\nに、コード内で、これは実際には問題ではありません。

于 2012-06-14T20:59:25.810 に答える
0

いいえ、それは何も消毒しません。

そのメーラーをごまかすのは非常に簡単です。

メーラーを操作するために、(あなたが読んだ)投稿値に何でも追加できます。

于 2012-06-14T19:50:14.813 に答える