【问题标题】:Complete protection against mail-injection完全防止邮件注入
【发布时间】:2011-03-21 15:56:15
【问题描述】:

假设我们要发送微不足道的反馈并让这些字段动态化:

  • 发件人姓名
  • 发件人电子邮件
  • 主题
  • 消息正文

这个 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," 这样的名称,但似乎所有可用的邮件客户端都正确处理它

【问题讨论】:

  • 以我的理解有限,我认为这就足够了:)
  • 很有趣——我敢肯定你几天前说过注射'.'靠它自己“永远行不通”......
  • 嗯,我还在学习,就像我们一样
  • 确实如此。我认为你因为暗示你错了而对我投了反对票……
  • 感谢您的纠正 - 另请参阅 spotthevuln.com/2011/01/sleep-smtp-command-injection

标签: php security email spam-prevention


【解决方案1】:

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

它看起来非常全面,只要您的电子邮件客户端支持您在标题中使用的RFC 2047 编码方法。 (某些网络邮件客户端无法识别编码。)

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

【讨论】:

    【解决方案2】:

    这取决于过滤器是否符合 rfc 规定,如果本地部分被 " 或诸如 "foo\r\nTo:poor-guy@dom.tld\r\ 之类的任何字符包围,则本地部分不能包含任何内容nTo: dummy"@foo.tld 会给你这样的标题:

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

    很糟糕……

    【讨论】:

    • 那么,你会说filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) 会允许吗?
    猜你喜欢
    • 2013-02-10
    • 2012-08-10
    • 2013-07-29
    • 1970-01-01
    • 2011-06-12
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多