[英]Does FILTER_VALIDATE_EMAIL make a string safe for insertion in database?
$str = '"mynam@blabl"@domanin.com';
filter_var($str, FILTER_VALIDATE_EMAIL);//return valid email.
上面的電子郵件返回true ...足夠公平,RFC 2822說這是一個合法的電子郵件地址。
我的問題是,如果您使用上述方法驗證電子郵件,即使您使用filter_var對其進行過濾,電子郵件也會進行可能損害數據庫的SQL注入?
我的問題是,如果您使用上述方法驗證電子郵件,即使您使用filter_var對其進行過濾,電子郵件也會進行可能損害數據庫的SQL注入?
filter_var
不是像mysql_real_escape_string()
那樣的數據庫特定的衛生設施的替代品! 人們也需要始終應用它。
是的 - 除了數據庫特定的轉義機制之外,不要依賴於SQL注入的安全性。
在SQL中使用之前,請始終使用mysql_real_escape_string()
。
我傾向於使用FILTER_VALIDATE_EMAIL檢查電子郵件是否有效,然后如果電子郵件需要保存到數據庫中,那么我將進一步下線,然后我將刪除危險字符。 mysql和mysqli庫在水中也已經死了,所以我建議使用PDO,這是一個更安全的選擇。
http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers
此外,下面的鏈接建議電子郵件地址中哪些字符合法,電子郵件地址中允許使用反引號和單引號,因此可能為什么FILTER_VALIDATE_EMAIL不會選擇它們...記住我們正在尋找無效的電子郵件地址而不是危險的電子郵件地址。
就像任何編程語言一樣,你應該始終將安全保持在列表的頂部!
而且,無論如何它都不安全。 _VALIDATE_EMAIL允許單引號'
和反引號` 。 (但是永遠不應該依賴清理函數,總是上下文轉義或使用參數化SQL。)
永遠不要使用VALIDATE
,也許你可以使用SANITILIZE
但我還是不推薦它。
考慮以下代碼:
$email = filter_var($_GET['email'], FILTER_VALIDATE_EMAIL);
$query = mysqli_query($sql, 'SELECT * FROM table WHERE email = "'.$email.'"');
基本的SQL注入是" or 1 = 1
,你已經聽說過了。但我們不能使用espaces,我們需要用@something.com
這樣的字符串來結束這個字符串。
因此,我們從"
並添加or'1'='1'
這將起作用(因為or1=1
將失敗)。現在我們需要@email.com
,讓我們將其添加為MySQL注釋( --@something.com
)。所以,這是結果:
"or'1'='1'--"@email.com
這是filter_var
有效電子郵件,對mysqli_query
不安全。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.