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 ]] )

接受者是第二个参数。标题都在第四个参数中。$messageor的内容$subject不会神奇地“溢出”到其他论点。

由于您$headers不依赖于用户输入,因此用户是否输入并不重要。不可能有这样的“注入”。你所做的只是扼杀信息。

PS:这段代码是错误的:

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

if($boolValidateOK == 1){

想想看。假设您所有的帖子值都不是“安全的”,但最后一个迭代的是。然后它将覆盖$boolValidateOK1,这就是循环结束时它将保留的值。

此外,PHP 确实具有布尔类型。如果您有布尔值,请将它们设置为truefalse而不是 1 和 0。这样更清楚。


无论如何,我建议使用PHPMailer 之类的东西。本机mail()功能使用起来非常尴尬。

于 2012-10-11T16:37:49.303 回答