簡體   English   中英

FILTER_VALIDATE_EMAIL是否可以安全地插入數據庫中的字符串?

[英]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不會選擇它們...記住我們正在尋找無效的電子郵件地址而不是危險的電子郵件地址。

就像任何編程語言一樣,你應該始終將安全保持在列表的頂部!

http://email.about.com/cs/standards/a/email_addresses.htm

而且,無論如何它都不安全。 _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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM