1

すべての _POST データをループしてメール ヘッダー インジェクションを防止しようとしていますが、変数が検証に合格していません。スラッシュを含む「日付」フィールドがいくつかあり、一部のフィールドが空白になっている可能性があります。それが何か関係があるかどうかはわかりません。誰かが私のロジックの問題を見ることができますか? 「失敗」メッセージが表示され続けます。ありがとう。

if(isset($_POST['submit'])) {

    $boolValidateOK = 1;

    function safe( $name ) {
       return( str_ireplace(array( "\r", "\n", "%0a", "%0d", "Content-Type:", "bcc:","to:","cc:" ), "", $name ) );
    }

    foreach($_POST as $value){
        if(!safe($value)){
            $boolValidateOK = 0;
        }else{
            $boolValidateOK = 1;
        }
    }

    if($boolValidateOK == 1){

        $headers  = 'MIME-Version: 1.0' . "\r\n";
        $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
        $to...etc
        $subject...etc
        $message...etc

        mail($to, $subject, $message, $headers);

        $success_message = "win";
    }else{
        $error_message = "fail";
    }
}
4

1 に答える 1

3

あなたがしていることは不必要です。PHP のmail()関数シグネチャに注意してください。

bool mail ( string $to , string $subject , string $message 
              [, string $additional_headers [, string $additional_parameters ]] )

受信者は 2 番目の引数です。ヘッダーはすべて 4 番目の引数にあります。$messageorの内容は$subject、他の引数に魔法のように「こぼれる」ことはありません。

$headersユーザー入力に依存しないため、ユーザーが入力したかどうかは問題ではありません。そのような「注入」は不可能です。あなたがしているのは、メッセージを解体することだけです。

PS: このコードは間違っています:

foreach($_POST as $value){
    if(!safe($value)){
        $boolValidateOK = 0;
    }else{
        $boolValidateOK = 1;
    }
}

if($boolValidateOK == 1){

考えてみてください。すべての投稿値が「安全」ではないが、反復された最後の値が安全であるとしましょう。次に、 に上書き$boolValidateOK1ます。これは、ループが終了するまで保持される値です。

また、PHP にはブール型があります。bool がある場合は、1 と 0 の代わりにtrueorに設定します。より明確です。false


とにかく、PHPMailerのようなものを使用することをお勧めします。ネイティブmail()関数は非常に使いにくいです。

于 2012-10-11T16:37:49.303 に答える