2011-07-06 46 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