完全防止邮件注入

时间:2011-03-21 15:56:15

标签: php security email spam-prevention

假设我们正在发送微不足道的反馈意见并将这些字段变为动态:

  • 发件人姓名
  • 发件人电子邮件
  • 受试者
  • 邮件正文

这个PHP代码足以保护我们免受各种邮件注入吗?

  //sanitizing email address
if ($email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){
  //encoding subj according to RFC and thus protecting it from all kinds of injections
  $subject = "=?UTF-8?B?".base64_encode($_POST['subject'])."?=";
  //encoding name for same reasons, and using sanitized email
  $from    = "From: =?UTF-8?B?".base64_encode($_POST['name'])."?= <$email>\r\n";
  //protecting body as it mentioned in http://php.net/mail
  $message = str_replace("\n.", "\n .", $_POST['text']);
  mail('me@example.com',$subject,$message,$from);
}

目前我正在使用"some@email.com, other@email.com,"这样的名称,但似乎所有可用的邮件客户端都正确处理

2 个答案:

答案 0 :(得分:2)

  

这个PHP代码足以保护我们免受各种邮件注入吗?

只要您的电子邮件客户端支持您在标头中使用的RFC 2047编码方法,它就会非常全面。 (某些Webmail客户端无法识别编码。)

除了不使用mail()之外,我唯一的建议是考虑is_email而不是内置过滤器。内置程序失败了许多边缘情况。

答案 1 :(得分:0)

这取决于,如果过滤器符合rfc指定本地部分不能包含任何内容,如果它被“或某些地址包围”foo \ r \ nTo:poor-guy@dom.tld \ r \ n nTo:dummy“@ foo.tld将为您提供如下标题:

Subject: foo
To: poor-guy@dom.tld
To: dummy"@foo.tld

非常糟糕......