使用 Swiftmailer 的 PHP 驱动的 HTML 联系表单有多安全?
Posted
技术标签:
【中文标题】使用 Swiftmailer 的 PHP 驱动的 HTML 联系表单有多安全?【英文标题】:How secure can a PHP-driven HTML contact form using Swiftmailer be? 【发布时间】: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 攻击。
【参考方案1】:
编辑:这个答案可能已经过时了。在我写这篇文章的时候,SwiftMailer 库存在一些问题。在这一点上,SwiftMailer
一切正常,被认为是比PHPMailer
提供更多功能的更好的库。
我建议你使用 phpmailer。它是我用过的最稳定的邮件库之一。这是一个应该可以工作的示例代码:
include("./phpmailer/class.phpmailer.php");
$mail = new PHPMailer(false); // the true param means it will throw exceptions on errors, which we need to catch
$mail->IsSMTP();
$mail->Host = "YourDomainName.com";
$mail->SMTPDebug = 2;
$mail->SMTPAuth = true;
$mail->SMTPSecure = "tls";
$mail->Host = "YourSMTPMailServer.com";
$mail->Port = 587;
$mail->Username = "your-auth-user@yoursmtpmailsercer.com";
$mail->Password = "password"; // GMAIL password
$mail->AddAddress("sendToThis@email.com", '<< >> ! " Receiver Name');
$mail->SetFrom('sendFROMthis@email.com', '<< >> ! " Sender Name');
$mail->Subject = "A testing subject";
$mail->AltBody = 'To view the message, please use an HTML compatible email viewer!';
$mail->MsgHTML('This is my <b>html</b> testing email, sent '.time());
$mail->Send();
您需要对此进行配置,以便它连接到您的电子邮件服务器,但它应该可以正常工作。到目前为止,Phpmailer 逃脱了我尝试过的所有事情。我唯一检查的是“sendToThis@email.com”。我用这段代码来做:
$email = "sendToThis@email.com";
$email = filter_var(filter_var($email,FILTER_SANITIZE_EMAIL),FILTER_VALIDATE_EMAIL);
if($email)
echo "This email is valid!";
else
echo "This email is INVALID!";
我希望这会有所帮助:)
【讨论】:
是的,我非常了解 PHPMailer,因为我使用了几年。我只是不喜欢这个工作方式。文档/教程在他们自己的网站上也已经过时了!我只是更喜欢 Swiftmailer,因为它得到了 Fabien Potencier/symphony 的支持。 @AlexV 我一直在使用 SwiftMailer -- 到目前为止没有任何问题,尽管我确实提前验证了用户名/电子邮件,并且这样的<>
字符将在它到达之前很长时间被删除邮件。以上是关于使用 Swiftmailer 的 PHP 驱动的 HTML 联系表单有多安全?的主要内容,如果未能解决你的问题,请参考以下文章
php发邮件:swiftmailer, php邮件库——swiftmailer
PHP - 使用 STARTTLS 和自签名证书的 Swiftmailer