2015-09-30 106 views
1

很抱歉,如果這似乎是一個愚蠢的問題,但我閱讀有關SQL注入和這樣的狀態的提及的情形,一個SQL命令如爲什麼WHERE「」=「」是真的?

SELECT * 
FROM Users 
WHERE Name ="" or ""="" 
AND Pass ="" or ""="" 

將是有效的,返回的所有記錄中的一個表用戶。我明白背後的邏輯做這樣的事情

SELECT * 
FROM Users 
WHERE UserId = 105 or 1=1 

,但我似乎無法找出原因""=""將是一個真實的陳述。我對SQL一般都很陌生,我已經搜索了一個答案,但大多數SQL注入的例子只提到了1 = 1的例子。

+0

blank = blank應該是正確的?爲什麼不是這樣? – ryanyuyu

+2

'「」=「」'無效SQL,因爲雙引號是標識符,而不是字符串文字。所以'「」=「」'會比較兩列 - 但是用「空名稱」。 –

+0

@a_horse_with_no_name在ANSI SQL中爲true,但在SQL服務器的所有實現中均爲true。 –

回答

1

空字符串等於空字符串,不是嗎?

+0

哈哈,我覺得自己像個白癡。現在我沒有看到你提到它。我想這真的是一個愚蠢的問題。 –

+0

順便說一句:您錯誤地將WHERE子句分組。並有更高的綁定然後或。所以實際上它被評估爲Name =「」或(「」=「」AND Pass =「」)或「」=「」 –

4

我似乎無法弄清楚爲什麼""=""將是一個真實的陳述。

一個空字符串等於另一個空字符串。不確定混淆的地方。

我搜索了一個答案,但大多數SQL注入的例子只提到1 = 1的例子。

這只是處理附加引號的另一種方式。原始代碼大概就像

string sql = 'SELECT * FROM Users WHERE Name ="' + username + '" AND Pass ="' + password + '"' 

所以傳入值'" or ""="'會導致你看到的字符串中。

另外一個你看到有時路過,這導致在SQL

SELECT * FROM Users WHERE Name ="" OR 1=1 --" AND Pass ="doesn't matter" 

它有效地消除剩餘的SQL,因爲編譯器會將其作爲評論的價值'" OR 1=1 --'

1

""=""將一個空字符串與另一個空字符串進行比較,所以結果爲真,就像比較'1'='1''FooBar'='FooBar'

+1

'「」'不是SQL中的字符串 - 它是一個(空的)標識符。 –

0

'' = ''1 = 1爲真的原因相同。你可以比較字符串和SQL中的字符串。

想想這樣:當你比較兩個名字,像這樣:'ihor' = 'ihor'他們自然是平等的,對吧?現在只需假裝名字是......空:)就是這樣。空字符串本身就是一個值,因此可以將它與另一個空字符串進行比較。

與空字符串(這是一個值)相反,NULL是沒有值。而且由於您無法將缺勤與缺勤進行比較,因此NULL = NULLNULL <> NULL在SQL中都是錯誤的。