您能否告訴我如何在不丟失原始郵件數據的情況下防止在中使用email injection?例如。如果我需要允許用戶使用\r\n
,To
,CC
等,所以我不想將它們從消息中完全剝離 - 我仍然希望它們交付,但不添加任何附加頭或以某種方式允許郵件注入發生。正確防止PHP中的郵件注入
大多數互聯網上的建議都建議完全剝離這些數據 - 但我不想這樣做。
我通過PHP mail()
函數發送純文本(非HTML)消息。
你會建議什麼?
您能否告訴我如何在不丟失原始郵件數據的情況下防止在中使用email injection?例如。如果我需要允許用戶使用\r\n
,To
,CC
等,所以我不想將它們從消息中完全剝離 - 我仍然希望它們交付,但不添加任何附加頭或以某種方式允許郵件注入發生。正確防止PHP中的郵件注入
大多數互聯網上的建議都建議完全剝離這些數據 - 但我不想這樣做。
我通過PHP mail()
函數發送純文本(非HTML)消息。
你會建議什麼?
要篩選的收件人電子郵件現場使用的有效電子郵件,看看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']);
假設你想要把訪問者的電子郵件地址可選報頭字段,像這樣:
$headers = "From: $visitorEmailAddress";
但是,如果
$ visitorEmailAddress
包含
「[email protected] \ n \ NBCC:[email protected]」
你做自己的垃圾郵件主機,開門郵件注入。 這是一個非常簡單的例子,但由於電子郵件是作爲純文本文件發送的,因此創造性的垃圾郵件製造者和惡意黑客可能會在您的電子郵件中潛入破壞性的腳本。即使附件也是轉換成明文,並且可以通過添加mimetype內容行來輕鬆發送附件。
如果您對FROM和/或TO字段的表單驗證正常,則必須查看電子郵件正文的表單驗證。我會去除' - ='和'= - '字符,並且阻止用戶使用strip_tags()
來輸入純HTML。
嘗試此的各種選擇進行了綜述:
http://www.codeproject.com/Articles/428076/PHP-Mail-Injection-Protection-and-E-Mail-Validatio
它涵蓋了幾個選項,並試圖解釋了每種風險。
使用指定的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);
?>
'要:'和'CC:'是頭 - 你無法將其取出即可維持原有功能。我不確定你在這裏問什麼。提供您最初想法的樣本,我們將嘗試引導您朝着正確的方向前進:-)。 – Matt 2012-08-14 12:44:58
你在哪裏使用用戶提供的數據?只是在消息體? – FtDRbwLXw6 2012-08-14 12:45:27
@drrcknlsn用戶提供的數據位於郵件正文和收件人電子郵件中。 – Atm 2012-08-14 12:47:50