【问题标题】:Are to, subject and body safe against injection using mail()?使用 mail() 进行注射是否安全?
【发布时间】:2017-03-06 22:43:42
【问题描述】:

我在php的官方文档中阅读了以下关于mail()函数的评论:

虽然没有记录,但对于参数 $to 和 $subject,mail() 函数至少将 \r 和 \n 更改为空格。因此,这些参数对于注入额外的标头是安全的。但是您可能需要检查 $to 是否有逗号,因为这些分隔多个地址,并且您可能不想发送给多个收件人。

正确吗?另外,我一直认为$message参数是安全的,不会被注入,是不是也正确?

我知道如何保护自己免受注射,我只是想知道我是否可以避免过滤这些参数。

【问题讨论】:

  • 取决于您所说的注入。如果您让用户为接收者提供值,那么他们当然可以提供任何他们想要的值。
  • @SamiKuhmonen 不,我的意思是注入额外的标头(电子邮件注入漏洞)。
  • @ĐàoMinhHạt 这不是重复的,我知道如何保护自己免受注射,我只是想知道我是否可以避免过滤这些参数。
  • 如果你对 C 足够熟悉并遵循逻辑,你可以在这里看到确切的替换:lxr.php.net/source/xref/PHP-MASTER/ext/standard/mail.c#284

标签: php email security


【解决方案1】:

是的,确实如此,但也不完整。在引擎源代码中,函数php_mail_build_headers 确保标头符合RFC 2822 § 3.6 对最大值数的要求。特别是,检查以下标头的单个值:

  • orig-date
  • from
  • sender
  • reply-to
  • to
  • bcc
  • message-id
  • in-reply-to
  • subject

是的,根据定义,消息参数对标头注入是安全的:消息部分插入在标头和正文之间的分隔新行之后,因此作为消息的一部分插入的任何类似标头的文本都将在消息正文。

【讨论】:

    【解决方案2】:

    对于您不想应用这些过滤器的评论。

    我认为您可以按照我的评论使用Zend_Mail 自动完成。

    $ composer require zendframework/zend-mail
    

    我从他们的documentation 粘贴这个:

    use Zend\Mail\Message;
    use Zend\Mail\Transport\Sendmail as SendmailTransport;
    
    $message = new Message();
    $message->addTo('matthew@example.org');
    $message->addFrom('ralph@example.org');
    $message->setSubject('Greetings and Salutations!');
    $message->setBody("Sorry, I'm going to be late today!");
    
    $transport = new SendmailTransport();
    $transport->send($message);
    

    【讨论】:

    • 谢谢,但这不是我问题的答案。
    猜你喜欢
    • 2011-08-08
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多