2011-07-06 17 views
7

我在我的网站上有一个PHP驱动的HTML联系表单。目前我使用PHP mail()功能。因此,我必须做许多用户输入验证,以避免email header injection attacks。我认为我很安全,但我可能忘记了一些东西,我想转移到一个可靠的PHP电子邮件库。我选择的图书馆是Swiftmailer使用Swiftmailer的PHP驱动的HTML联系表格有多安全?

现在我要检查,如果Swiftmailer解决以下问题:

  1. 除去或逃避发件人名称<>字符。
  2. 删除从发送者的名字换行符(\n\r\n ...)。
  3. 从电子邮件主题中删除或转义换行符。
  4. 正常化换行符在消息主体(电子邮件的内容)。根据PHP文档,内容应使用\n,使用\r\n作为电子邮件标题分隔符。

PS:我试图联系Swiftmailer团队与我的问题没有成功,所以我在这里尝试。

编辑:

我做了一些测试用例Swiftmailer,这是我迄今发现:

  1. 当你有一个<>在发送者的名字,你会得到a Undeliverable电子邮件错误邮件。这可能会导致邮件服务器的DOS attack(可能我错了)。这是正常的吗?
  2. 换行符被转义,所以注入攻击失败。
  3. 换行符被转义,所以注入攻击失败。
  4. 测试,但我无法看到Swiftmailer做什么(如果它的东西)。所以我仍然在黑暗中。

有人能澄清#1和#4我吗?我不知道这是否是正常的行为......

+6

您可以通过代码总是看...毕竟,Swiftmailer只是一个PHP脚本。如果你是这种关于漏洞的偏执狂,那么你可能想要审核任何外部库。 –

+2

'保护头部注入攻击而不剥夺请求数据内容'(从主页),并通过代码粗略扫描我会假设,如果你传入任何无效的东西,你会得到一个异常,而不是无声的接受。 – hakre

+1

看来只要你从任何用户提交的头文件和wordwrap($ message,70)中删除\ n和\ r,你应该没问题。从发件人名称中剥离< and >的交易是什么?我很想知道这些角色给你什么样的黑客攻击。任何信息非常感谢。 – dqhendricks

回答

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 = "[email protected]"; 
$mail->Password = "password"; // GMAIL password 
$mail->AddAddress("[email protected]", '<< >> ! " Receiver Name'); 
$mail->SetFrom('[email protected]', '<< >> ! " 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至今逃脱了我所尝试过的一切。我唯一检查的是“[email protected]”。我使用此代码做到这一点:

$email = "[email protected]"; 
$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

+0

@AlexV我一直在使用SwiftMailer - 迄今为止没有任何问题,尽管我会事先验证用户名/电子邮件,并且这样的字符在到达邮件程序之前会很长时间被删除。 – LazyOne