2011-10-03 109 views
0

一位客戶聯繫我們,擔心近期有一些企圖在她的網站上濫用聯繫我們表單。 顯然,有人試圖在消息字段中編寫一些代碼,很可能是爲了垃圾郵件目的而使用後端腳本(使用這些時髦標頭的電子郵件注入)。我應該採取什麼樣的安全預防措施來「聯繫我們」表單?

目前,安全就緒是一個JavaScript文件,它在提交之前驗證表單。後端沒有任何檢查。

所以,我添加了一些驗證在後端,只是一些簡單的東西,比如:

$namePattern = '/^[a-z0-9()\/\'":\*+|,.; \- !?&#[email protected]]{2,75}$/i'; 
$emailPattern = '/^[^@\s][email protected]([-a-z0-9]+\.)+[a-z]{2,}$/i'; 
$phonePattern = '[0-9\.\-]'; 
$array = $_POST; 
//This is the first line of defense. 
if (!preg_match ($namePattern, $array['c_firstname']){ 
    die ("Please go back and enter a correct first name"); 
} 
...More if statements to check other fields. 
//The second line of defense. 
function remove($name){ 
    return(str_ireplace(array("\r", "\n", "%0a", "%0d", "Content-Type:", "bcc:","to:","cc:"), " Something Replaced ", $name)); 
} 
    $array['c_date'] = remove ($array['c_date']); 
    //Check the rest of the array. 

對不起,如果有什麼問題我的邏輯或我的語法,我並沒有實際測試以上(因爲該網站是活的,我想在測試之前儘可能多地寫出代碼)。

以上安全檢查是否足夠?我的模式檢查是否正確(我主要是複製其他人的模式,因爲我不完全理解符號)。

這個特殊的郵件格式使用Zend Mail,所以理論上它比普通的PHP郵件更安全。

而且,這並不重要,但如果有人有時間,你能教我如何循環遍歷數組並分配一個新的值給每個元素(IE的而不是寫$array['c_date'] = remove ($array['c_date']);幾次,一個簡單的函數什麼,沒有工作對我來說。

非常感謝您的幫助,有一個美好的一天!

+1

作爲一般規則,如果你不理解它,這是不安全的。這是因爲您可能會嘗試在不打算使用的情況下使用它。例如,在標籤內部使用htmlentities是一個安全漏洞,例如屬性' href = ...',因爲它不會阻止你希望的XSS攻擊。知道爲什麼很重要。 – DampeS8N

回答

1

一般來說,關鍵是要確保任何來自用戶的輸入來不執行。提供你的代碼生成電子郵件是編碼所有用戶輸入然後應該不會有太多問題。

模式匹配輸入不會傷害(除非你特別希望用戶能夠輸入特定的值,如html代碼)。

個人而言,我會重新向客戶保證,任何插入到表單中的腳本/代碼都不會執行,並且除非執行,否則不會造成危害。

1

只要正確地消毒你的輸入就足夠了。使用htmlspecialchars()htmlentities(),您也可以去掉任何<或>字符,這應該足夠了。

+0

如何使用'htmlspecialchars()'或'htmlentities()',我只是傳遞一個字符串,它會刪除所有的HTML屬性和東西?感謝您的建議。 – zermy

+1

是的,你應該閱讀[手冊](http://il2.php.net/manual/en/function.htmlspecialchars.php) –

1

郵件表單最常遇到的問題來自位於網絡上的錯誤代碼示例,其中目標電子郵件是從表單中的隱藏字段中獲取的,從而允許攻擊者替換該電子郵件並將該服務器用作垃圾郵件樞紐。

只要確保電子郵件沒有用戶輸入。對於其他情況,可能發生的最糟糕的情況是您將收到垃圾郵件,只要您想讓人們與您聯繫,就會發生。

相關問題