使用Swiftmailer驱动的PHP HTML联系表格有多安全?

7
我网站上有一个由PHP驱动的HTML联系表单。目前我使用PHP的mail()函数。因此,我必须进行许多用户输入验证以避免电子邮件头注入攻击。我认为我很安全,但我可能忘记了一些东西,我想转向一个可靠的PHP电子邮件库。我选择的库是Swiftmailer
现在我想检查Swiftmailer是否解决以下问题:
1. 删除或转义发件人名称中的<>字符。 2. 从发件人名称中删除换行符(\n\r\n等)。 3. 从电子邮件主题中删除或转义换行符。 4. 规范消息正文中的换行符(电子邮件内容)。根据PHP文档,应在内容中使用\n,并使用\r\n作为电子邮件标题分隔符。
PS:我尝试与Swiftmailer团队联系我的问题,但没有成功,所以我在这里尝试。
编辑:
我对Swiftmailer进行了一些测试,目前发现以下情况:
1. 当发件人名称中有<>时,您会收到一个“不可传递”的电子邮件错误邮件。这可能会在某种程度上导致您的邮件服务器DOS攻击(也许我是错的)。这正常吗?! 2. 换行符被转义,因此注入攻击失败。 3. 换行符被转义,因此注入攻击失败。 4. 已测试,但我无法看到Swiftmailer做了什么(如果它确实做了什么)。所以我还在黑暗中。
有人能为我澄清1和4吗?我不确定这是否是正常行为...

6
您总是可以查看代码...毕竟,Swiftmailer只是一个 PHP 脚本。如果您对漏洞如此担忧,那么您可能希望审核任何外部库。 - Marc B
2
在不剥离请求数据内容的情况下,防止头部注入攻击。从对代码的粗略扫描中可以推断,如果传入任何无效内容,您将得到一个异常而不是静默接受。 - hakre
1
似乎只要从任何用户提交的标题中剥离 \n 和 \r,并使用 wordwrap($message, 70),你就应该没问题了。去除发件人名称中的 < 和 > 是什么意思?我非常想知道这些字符会让你面临哪些黑客攻击。任何信息都将不胜感激。 - dqhendricks
@dqhendricks 请看我的“编辑”段落。我不确定为什么在我的代码中添加了这个验证,但如果我记得正确的话,那是因为它可能会破坏一些邮件服务器。使用Swiftmailer时,我有一个系统管理员的“无法投递的电子邮件”电子邮件消息,这可能会导致对您的邮件服务器(或收件箱)进行DOS攻击。 - AlexV
1个回答

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!";
}

希望这能帮到你 :)

2
是的,我非常了解PHPMailer,因为我在几年前使用过它。我只是不喜欢它的工作方式。他们自己网站上的文档/教程也已经过时了!我更喜欢Swiftmailer,因为它由Fabien Potencier/symphony支持。 - AlexV
@AlexV 我一直在使用SwiftMailer--到目前为止完全没有问题,尽管我会提前验证用户名/电子邮件地址并且这种 <> 字符将在到达邮件程序之前被删除很长时间。 - LazyOne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接