2013-02-22 72 views
0

我在想,如果這個代碼是安全與否,

$mail = mail($_POST['email'], 'foo' , 'foo'); 

據報道,爲不安全的鄉郊。

+1

你基本上可以發送郵件給你的服務器的任何人。它可以被垃圾郵件發送者濫用。 – 2013-02-22 14:40:20

+1

將$ _POST放入任何東西都不是明智的選擇,請始終清理您的輸入! – Drewdin 2013-02-22 14:40:25

+2

當引用安全公告時,請鏈接到它或引用它。它永遠不會包含「這是不安全的」,而是確切描述問題是什麼以及它出現在哪個版本的語言中。 – 2013-02-22 14:41:25

回答

2

當然,它不安全,容易受到郵件注入。你爲什麼要問?

SMTP協議非常簡單,非常接近HTTP協議。
它包含標題和每個標題分隔另一個僅僅換行。 因此,有$ _ POST [ '電子郵件']等於

[email protected] 
To: [email protected] 

你的腳本將發送2個郵件。
幾乎每個參數都是一樣的,包括主題。

此外,就像在HTTP中一樣,標頭通過空行與正文分開。
因此,攻擊者也可能改寫體以及

爲了防止這種情況,只需要檢查用戶輸入的字段(當然身體CEPT),用於\n\r字符。

+0

對不起,我的糟糕解釋,我只是有興趣在頭注入:PHP的santize $反對頭注入? – user1700840 2013-02-22 15:21:25

-1

惡意用戶無法注入頭文件,但他可以傳遞一個長長的逗號分隔的電子郵件地址並使用您的服務進行垃圾郵件。

在使用函數(或任何您需要的)之前,您應該始終對用戶輸入數據執行檢查!

3

正如其他人已經說過,使用mail($_POST['email']...)是不安全的,有幾個原因,你甚至開始考慮頭注入攻擊。

允許將POST變量用作'收件人'地址是不安全的,因爲您的表單可能用於將郵件發送給任何人。即使垃圾郵件發送者無法將其消息發送到正文中,也可以通過用數千條消息來爆炸他們的郵箱來攻擊他人。其次,你沒有告訴我們你的$_POST['email']變量是否已經過消毒處理。在使用它作爲一個之前,你應該檢查它是一個有效的電子郵件地址。否則,是的,它可能會導致你的郵件惡作劇。幸運的是,PHP有一個內置的電子郵件驗證功能:

$sanitisedEmail = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL); 
if(!$sanitisedEmail) {die('your email address is invalid');} 

但是,除了別的,如果你想避免頭注入攻擊,你應該避免使用PHP的mail()功能完全。內置的mail()函數是非常基礎的,並且有很多可以被黑客利用的弱點。你會是使用優質包裝庫如phpMailer更好。

phpMailer的主要目的是使發送電子郵件更簡單的PHP - 使用標準mail()函數所需的PHP代碼可以變得非常混亂,如果你需要開始添加標頭或附件; phpMailer使這一切非常簡單。

但此外,使用它還會使您的代碼更安全; phpMailer爲你做所有必要的輸入消毒;它會驗證電子郵件地址並將惡意標頭攻擊作爲其標準過程的一部分。

希望有所幫助。