我使用filter_var
消毒或驗證電子郵件PHP
和功能檢查,如果電子郵件是有效的
function checkEmail($email)
{
return filter_var($email, FILTER_VALIDATE_EMAIL);
}
這只是我做的一件事。在註冊例如我使用此功能驗證電子郵件,然後插入數據庫(使用的準備語句ofc)但是,在這個函數中使用sanitisation是必要的嗎?是否有可能導致問題的「有效」但「危險」電子郵件...?
我使用filter_var
消毒或驗證電子郵件PHP
和功能檢查,如果電子郵件是有效的
function checkEmail($email)
{
return filter_var($email, FILTER_VALIDATE_EMAIL);
}
這只是我做的一件事。在註冊例如我使用此功能驗證電子郵件,然後插入數據庫(使用的準備語句ofc)但是,在這個函數中使用sanitisation是必要的嗎?是否有可能導致問題的「有效」但「危險」電子郵件...?
FILTER_VALIDATE_EMAIL
確保電子郵件地址有效。它與從字符串中消除「危險」字符(即在某些情況下具有特殊含義的字符)無關。
所以輸入驗證是一切都很好,和必要的檢查你的數據符合業務規則,但它不會從您注入值到另一個上下文轉義特殊字符,免除你。因此,任何你放入HTML頁面的字符串,你必須繼續使用htmlspecialchars()
,並且任何你在MySQL查詢中放入字面值的字符串,你必須繼續使用mysql_real_escape_string()
(或者更好的是使用參數化查詢在mysqli或PDO中,以避免必須停止字符串查詢)。無論您進行了哪些輸入驗證,構建內容時都必須始終發生輸出轉義。
是否有任何「有效」但「危險」的電子郵件,可能會導致問題......?
當然可以。當注入到HTML中時a&[email protected]
會中斷;注入URL組件時,a%[email protected]
會中斷; a'[email protected]
會在注入SQL字符串文字時破壞。依賴於上下文的輸出轉義是至關重要的;試圖刪除所有可能在中遇到麻煩的字符,某些上下文將意味着擺脫幾乎所有的標點符號,這並不是很好。
爲了安全起見,我會在驗證它之前對其進行清理,因爲如果電子郵件地址包含換行符,它也會通過驗證,這可能會導致問題(security bulletin)。
return filter_var(
filter_var(
$email,
FILTER_SANITIZE_EMAIL
),
FILTER_VALIDATE_EMAIL);
您還可以使用trim()
刪除尾隨空白和換行符。
驗證和衛生是兩種不同的行爲。
確認已完成,以確保用戶輸入的格式符合您的要求。儘管衛生設施已完成,以防止惡意用戶破壞您的數據庫/應用程序。
這兩個操作通常都是必需的。
如果您使用MySQLi或PDO準備好的語句,則可以跳過衛生設施。
根據Wikipedias在email addresses上的條目,郵件地址中允許有幾個特殊字符,如'
和%
。所以你應該消毒或使用預先準備好的陳述。
所以基本上電子郵件字段sanitationation是不需要的,因爲我已經逃避查詢,並逃避輸出。 – John
@John:是的,如果你已經在所有輸出階段逃跑了,那麼就沒有必要進行消毒。 PHP'VALIDATE'和'SANITISE'之間的區別在於,前者在字符串不匹配時不返回任何內容,後者僅僅刪除無效字符。可能你想驗證而不是SANITIZE,因爲如果用戶輸入一個無效地址,並讓他們知道他們做錯了,而不是通過刪除字符來猜測,那麼你就會失敗。 – bobince