2012-08-14 31 views
8

您能否告訴我如何在不丟失原始郵件數據的情況下防止在中使用email injection?例如。如果我需要允許用戶使用\r\n,To,CC等,所以我不想將它們從消息中完全剝離 - 我仍然希望它們交付,但不添加任何附加頭或以某種方式允許郵件注入發生。正確防止PHP中的郵件注入

大多數互聯網上的建議都建議完全剝離這些數據 - 但我不想這樣做。

我通過PHP mail()函數發送純文本(非HTML)消息。

你會建議什麼?

+0

'要:'和'CC:'是頭 - 你無法將其取出即可維持原有功能。我不確定你在這裏問什麼。提供您最初想法的樣本,我們將嘗試引導您朝着正確的方向前進:-)。 – Matt 2012-08-14 12:44:58

+0

你在哪裏使用用戶提供的數據?只是在消息體? – FtDRbwLXw6 2012-08-14 12:45:27

+0

@drrcknlsn用戶提供的數據位於郵件正文和收件人電子郵件中。 – Atm 2012-08-14 12:47:50

回答

7

要篩選的收件人電子郵件現場使用的有效電子郵件,看看filter_var()

$email = filter_var($_POST['recipient_email'], FILTER_VALIDATE_EMAIL); 

if ($email === FALSE) { 
    echo 'Invalid email'; 
    exit(1); 
} 

這將確保你的用戶只提供單一的,有效的電子郵件,然後你就可以傳遞給mail()功能。據我所知,使用PHP mail()函數無法通過郵件正文注入頭文件,因此數據不需要任何特殊處理。

更新:

the documentation for mail(),當它直接對話的SMTP服務器,則需要防止句號在郵件正文:

$body = str_replace("\n.", "\n..", $body); 

更新#2:

顯然,它也可以通過主題注入,但是由於沒有FILTER_VALIDATE_EMAIL_SUBJECT,您需要做過濾自己:

$subject = str_ireplace(array("\r", "\n", '%0A', '%0D'), '', $_POST['subject']); 
+0

謝謝,但在互聯網上它說可以使用mail()函數向郵件正文注入頭文件。 – Atm 2012-08-14 13:00:08

+0

不過,謝謝你的filter_var函數。我將使用它而不是我正在使用的正則表達式。 – Atm 2012-08-14 13:06:23

+2

@Atern注filter_var對它允許的郵件有一些限制,這就是爲什麼我仍然使用正則表達式進行電子郵件驗證,我使用:http://www.dominicsayers.com/isemail – Sammaye 2012-08-14 13:07:35

3

假設你想要把訪問者的電子郵件地址可選報頭字段,像這樣:

$headers = "From: $visitorEmailAddress"; 

但是,如果

$ visitorEmailAddress

包含

[email protected] \ n \ NBCC:[email protected]

你做自己的垃圾郵件主機,開門郵件注入。 這是一個非常簡單的例子,但由於電子郵件是作爲純文本文件發送的,因此創造性的垃圾郵件製造者和惡意黑客可能會在您的電子郵件中潛入破壞性的腳本。即使附件也是轉換成明文,並且可以通過添加mimetype內容行來輕鬆發送附件。

如果您對FROM和/或TO字段的表單驗證正常,則必須查看電子郵件正文的表單驗證。我會去除' - ='和'= - '字符,並且阻止用戶使用strip_tags()來輸入純HTML。

0

使用指定的MIME電子郵件庫,如Mail_Mime

<?php 
include 'Mail.php'; 
include 'Mail/mime.php' ; 

$mime = new Mail_mime(); 

$mime->setTXTBody("Message goes here"); 
$hdrs = $mime->headers(array(
    'From' => '[email protected]', 
    'Subject' => 'Test mime message' 
)); 
$body = $mime->get(); 

$mail = &Mail::factory('mail'); 
$mail->send('[email protected]', $hdrs, $body); 

?>