9

元のメッセージ データを失うことなく、PHP で電子メール インジェクションを防止する方法を教えてください。たとえば、mail()ユーザーが 、 などを使用できるようにする必要がある場合\r\n、メッセージからそれらを完全に取り除きたくありません - それでも配信したいのですが、追加のヘッダーを追加したり、何らかの方法でメールインジェクションが発生したりすることはありません。ToCC

インターネット上のアドバイスのほとんどは、そのデータを完全に削除することを提案していますが、私はそうしたくありません。

mail()PHP関数を使用してプレーン テキスト (非 HTML) メッセージを送信しています。

何をアドバイスしますか?

4

4 に答える 4

11

受信者の電子メール フィールドで使用する有効な電子メールをフィルタリングするには、以下を参照してくださいfilter_var()

$email = filter_var($_POST['recipient_email'], FILTER_VALIDATE_EMAIL);

if ($email === FALSE) {
    echo 'Invalid email';
    exit(1);
}

これにより、ユーザーが単一の有効な電子メールのみを提供するようになり、それをmail()関数に渡すことができます。私の知る限り、PHPmail()関数を使用してメッセージ本文にヘッダーを挿入する方法はないため、データに特別な処理は必要ありません。

アップデート:

のドキュメントにmail()よると、SMTP サーバーと直接通信している場合は、メッセージ本文での完全な停止を防ぐ必要があります。

$body = str_replace("\n.", "\n..", $body);

更新 #2:

どうやら、件名を介して注入することも可能ですが、 がないためFILTER_VALIDATE_EMAIL_SUBJECT、自分でフィルタリングを行う必要があります。

$subject = str_ireplace(array("\r", "\n", '%0A', '%0D'), '', $_POST['subject']);
于 2012-08-14T12:52:46.933 に答える
4

次のように、オプションのヘッダー フィールドに訪問者の電子メール アドレスを入力するとします。

$headers = "From: $visitorEmailAddress";

ただし、

$visitorEmailAddress

含む

"address@email.com\n\nBCC:spam@v1agra.com"

自分自身をスパム ホストにして、メール インジェクションの扉を開いています。これは非常に単純な例ですが、メールはプレーンテキスト ファイルとして送信されるため、クリエイティブなスパマーや悪意のあるハッカーがメールに有害なスクリプトを忍び込ませる可能性があります。添付ファイルもプレーンテキストに変換され、mimetype コンテンツ行を追加することで簡単に添付ファイルを送信できます。

FROM および/または TO フィールドのフォーム検証に問題がない場合は、メール本文のフォーム検証を確認する必要があります。「-=」と「=-」の文字を取り除き、ユーザーがstrip_tags().

于 2012-08-14T12:54:20.643 に答える
1

さまざまなオプションを確認するには、これを試してください。

http://www.codeproject.com/Articles/428076/PHP-Mail-Injection-Protection-and-E-Mail-Validatio

いくつかのオプションについて説明し、それぞれの利点とリスクについて説明します。

于 2013-09-05T21:30:15.677 に答える
0

次のような指定された MIME 電子メール ライブラリを使用しますMail_Mime

<?php
include 'Mail.php';
include 'Mail/mime.php' ;

$mime = new Mail_mime();

$mime->setTXTBody("Message goes here");
$hdrs = $mime->headers(array(
    'From'    => 'you@yourdomain.com',
    'Subject' => 'Test mime message'
));
$body = $mime->get();

$mail = &Mail::factory('mail');
$mail->send('postmaster@localhost', $hdrs, $body);

?>
于 2015-04-24T17:20:57.867 に答える