【发布时间】:2011-09-29 21:55:53
【问题描述】:
我的网站上有一个 PHP 驱动的 HTML 联系表单。目前我使用 PHP mail() 函数。因此,我必须进行许多用户输入验证以避免email header injection attacks。我认为我很安全,但我可能忘记了一些事情,我想转移到一个可靠的 PHP 电子邮件库。我选择的库是Swiftmailer。
现在我想检查 Swiftmailer 的地址是否如下:
- 删除或转义发件人姓名中的
<和>字符。 - 从发件人姓名中删除换行符(
\n、\r\n...)。 - 从电子邮件主题中删除或转义换行符。
- 规范化消息正文(电子邮件的内容)中的换行符。根据 PHP 文档,
\n应在内容中使用,\r\n作为电子邮件标题分隔符。
PS:我尝试联系 Swiftmailer 团队解决我的问题,但没有成功,所以我在这里尝试。
编辑:
我用 Swiftmailer 做了一些测试用例,这是我目前发现的:
- 当您的发件人名称中有
<或>时,您会收到一封无法投递 的电子邮件错误邮件。这可能会导致您的邮件服务器出现DOS attack(也许我错了)。这正常吗?! - 换行符被转义,因此注入攻击失败。
- 换行符被转义,因此注入攻击失败。
- 经过测试,但我看不到 Swiftmailer 做了什么(如果它做了什么)。所以我在这里还是一头雾水。
有人可以为我澄清#1 和#4 吗?我不确定这是否是正常行为...
【问题讨论】:
-
您可以随时查看代码...毕竟,Swiftmailer 只是一个 PHP 脚本。如果您对漏洞如此偏执,那么您可能无论如何都希望审核任何外部库。
-
Protect from header injection attacks without stripping request data content(来自主页)并通过粗略扫描代码,我认为如果您传入任何无效的内容,您将获得异常而不是无声接受。 -
看来只要你从任何用户提交的标题中去掉 \n 和 \r ,以及 wordwrap($message, 70),你应该没问题。从发件人姓名中剥离 是怎么回事?我很想知道这些角色会让你接受什么样的黑客攻击。非常感谢任何信息。
-
@dqhendricks 请参阅我的“编辑”段落。不知道为什么我在我的代码中添加了这个验证,但如果我没记错的话,那是因为它会破坏一些邮件服务器。使用 Swiftmailer,我有一个系统管理员“无法投递的电子邮件”电子邮件消息,它可能导致恕我直言,对您的邮件服务器(或收件箱)进行 DOS 攻击。
标签: php security swiftmailer contact-form email