使用mail()对注射,主体和身体安全吗?

时间:2017-03-06 13:51:14

标签: php email security

我在php的官方文档中已经阅读了以下关于mail()函数的注释:

  

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

这是对的吗?另外,我一直认为$ message参数对注射是安全的,它也是正确的吗?

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

我认为您可以使用我评论的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);