【问题标题】:PHP Simple Header Injection PreventionPHP 简单的标头注入预防
【发布时间】:2012-10-11 16:22:03
【问题描述】:

我试图通过循环遍历所有 _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";
    }
}

【问题讨论】:

  • 对我来说,这看起来像是一种无用且可能有害的安全“改进”。除非您允许您的用户直接指定邮件标头,否则除了潜在的屠夫用户输入之外,这样做没有任何意义。
  • 我是编程新手。你能解释一下怎么做吗?那么我将如何防止标头注入呢?
  • 那么,剩下的代码在哪里(即:你用etc 替换的东西)?这听起来不像是你需要做的事情
  • 对不起,剩下的代码是一个15+字段的邮件表单。
  • 那你怎么设置$headers

标签: php email code-injection


【解决方案1】:

你正在做的事情是不必要的。注意PHP的mail()函数签名:

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

收件人是第二个参数。标题都在第四个参数中。 $message$subject 的内容不会神奇地“溢出”到其他参数。

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

PS:这段代码是错误的:

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

if($boolValidateOK == 1){

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

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


无论如何,我建议使用PHPMailer 之类的东西。原生的mail()函数用起来很别扭。

【讨论】:

  • 感谢您的回答。所以你的意思是我可以废弃所有的代码,然后让mail($to, $subject, $message, $headers); 发送到'submit'
  • @user1738750 您可能还需要确保一些事情,例如:电子邮件有效,没有大量收件人(例如:"user@abc.com , user2@abc.com ..."),邮件正文被剥离潜在的恶意代码(会影响收件人,而不是您)等
  • 该表格只会发送到 1 个静态电子邮件地址。您将如何防止恶意代码?
  • @user1738750 您可以使用strip_tags() 从邮件中删除所有 HTML。
猜你喜欢
  • 1970-01-01
  • 2016-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 2016-11-08
  • 2020-09-03
相关资源
最近更新 更多