2012-05-03 61 views
11

我有一個頁面,我想在GET參數中接受一個電子郵件地址。如果我使用FILTER_VALIDATE_EMAIL,我仍然容易受到xss和javascript注入攻擊,等等?PHP的FILTER_VALIDATE_EMAIL提供足夠的安全性嗎?

我不問,如果是電子郵件地址的好,還是不夠好,驗證。我想知道是否仍然可以通過通過它的任意字符串注入糟糕的Web代碼 - 是否需要執行額外的篩選以防止出現這種情況?

回答

9

是的,一個有效的電子郵件地址可以用作一些精心設計的字符串的容器。

走出「過濾」的思維定勢,進入了「逃離」的心態。通用的「使其安全」過濾器根本不存在。

例如,如果電子郵件地址將被輸出到一個純文本文檔,則需要無計可施。如果它被輸出到一個html文檔中,作爲文本節點,那麼它需要被轉義爲html特殊字符和實體。如果它被放入一個html文檔中,並且它的值將在一個html屬性中,那麼非常非常小心的轉義就需要被執行,並且它將取決於上下文。如果它正在sql查詢中使用,那麼它需要通過特定於數據庫的轉義函數進行轉義。等等。

這是關於使用的上下文,而不是字符串的內容。這適用於所有事情(不僅僅是電子郵件或其他用戶輸入),它不僅僅是安全問題,而是編程正確性的問題。

僅供參考,我記得電子郵件地址規範允許引用的字符串,所以像"<script>alert('xss')</script>"@example.com將是有效的。可能性是顯而易見的。

+1

例如,沒有普遍的「安全」問候語。有些社會有禮貌的行爲在別人中是粗魯的。瞭解你的背景! – Xeoncross

+1

+1。 FILTER_VALIDATE_EMAIL用於檢查電子郵件地址是否有效,如上例所示,與任何其他注射問題無關。如果它*阻止了*引號或者小於*,那麼它只會出現同時發生的情況,而不會成爲您應該依賴的東西。 – bobince

2

這應該是足夠好,但當然你還是應該逃避它輸入到數據庫中的時候,等你永遠不知道什麼樣的錯誤,可以在PHP或Apache等存在,這可能允許攻擊反正發生。

+5

與錯誤無關。有效的電子郵件地址不是自動數據庫安全的。電子郵件'john.o'connor @ somewhere.com'會給你帶來麻煩,如果你只是將其注入到SQL查詢中...... – Cylindric

相關問題