2012-06-02 101 views
1

我使用filter_var消毒或驗證電子郵件PHP

和功能檢查,如果電子郵件是有效的

function checkEmail($email) 
{ 
    return filter_var($email, FILTER_VALIDATE_EMAIL); 
} 

這只是我做的一件事。在註冊例如我使用此功能驗證電子郵件,然後插入數據庫(使用的準備語句ofc)但是,在這個函數中使用sanitisation是必要的嗎?是否有可能導致問題的「有效」但「危險」電子郵件...?

回答

5

FILTER_VALIDATE_EMAIL確保電子郵件地址有效。它與從字符串中消除「危險」字符(即在某些情況下具有特殊含義的字符)無關。

所以輸入驗證是一切都很好,和必要的檢查你的數據符合業務規則,但它不會從您注入值到另一個上下文轉義特殊字符,免除你。因此,任何你放入HTML頁面的字符串,你必須繼續使用htmlspecialchars(),並且任何你在MySQL查詢中放入字面值的字符串,你必須繼續使用mysql_real_escape_string()(或者更好的是使用參數化查詢在mysqli或PDO中,以避免必須停止字符串查詢)。無論您進行了哪些輸入驗證,構建內容時都必須始終發生輸出轉義。

是否有任何「有效」但「危險」的電子郵件,可能會導致問題......?

當然可以。當注入到HTML中時a&[email protected]會中斷;注入URL組件時,a%[email protected]會中斷; a'[email protected]會在注入SQL字符串文字時破壞。依賴於上下文的輸出轉義是至關重要的;試圖刪除所有可能在中遇到麻煩的字符,某些上下文將意味着擺脫幾乎所有的標點符號,這並不是很好。

+0

所以基本上電子郵件字段sanitationation是不需要的,因爲我已經逃避查詢,並逃避輸出。 – John

+0

@John:是的,如果你已經在所有輸出階段逃跑了,那麼就沒有必要進行消毒。 PHP'VALIDATE'和'SANITISE'之間的區別在於,前者在字符串不匹配時不返回任何內容,後者僅僅刪除無效字符。可能你想驗證而不是SANITIZE,因爲如果用戶輸入一個無效地址,並讓他們知道他們做錯了,而不是通過刪除字符來猜測,那麼你就會失敗。 – bobince

0

爲了安全起見,我會在驗證它之前對其進行清理,因爲如果電子郵件地址包含換行符,它也會通過驗證,這可能會導致問題(security bulletin)。

return filter_var(
     filter_var(
      $email, 
      FILTER_SANITIZE_EMAIL 
     ), 
     FILTER_VALIDATE_EMAIL); 

您還可以使用trim()刪除尾隨空白和換行符。

1

驗證和衛生是兩種不同的行爲。

確認已完成,以確保用戶輸入的格式符合您的要求。儘管衛生設施已完成,以防止惡意用戶破壞您的數據庫/應用程序。

這兩個操作通常都是必需的。

如果您使用MySQLi或PDO準備好的語句,則可以跳過衛生設施。

0

根據Wikipedias在email addresses上的條目,郵件地址中允許有幾個特殊字符,如'%。所以你應該消毒或使用預先準備好的陳述。