2013-03-19 143 views
3

我也遇到相當怪異的行爲與SQL LIKE,=和LIKE BINARYSQL = VS LIKE VS LIKE BINARY,不區分大小寫

注:密碼的前3個字符其實是3Vf和查詢的其餘部分語法上也是正確的。

SUBSTRING(password,1, 3) = "3VF"  -> returns true 
SUBSTRING(password,1, 3) = "3Vf"  -> returns true 

SUBSTRING(password,1, 3) LIKE "3VF" -> returns true 
SUBSTRING(password,1, 3) LIKE "3Vf" -> returns true 

但是如果我使用LIKE BINARY,我得到區分大小寫行爲

SUBSTRING(password,1, 3) LIKE BINARY "3VF" -> returns false 
SUBSTRING(password,1, 3) LIKE BINARY "3Vf" -> returns true 

我不明白爲什麼comparisions不區分大小寫。考慮到密碼是VARCHAR(64)。在我看到的所有資源中,它都表示=和LIKE都區分大小寫。

注:我運行了完整的查詢是

SELECT * from users where username="natas16" AND SUBSTRING(password,1, 3) = XX 

而且,這是不是一個真實的世界應用程序,但一個NATAS水平。這是一個'黑客'遊樂場。他們與你應該利用的漏洞有不同的級別。所以這不是一個真實世界的例子。

http://www.overthewire.org/wargames/natas/

+1

只是讓我們很清楚的敏感,你不應該來的密碼存儲在數據庫中。使用'PASSWORD('Function')'來正確存儲它。雖然你描述的行爲很奇怪。 https://dev.mysql.com/doc/refman/5.0/en/password-hashing.html – Colton 2013-03-19 16:09:08

+0

你是否將passwordword保存爲純文本?使用散列鍵和列分類作爲latin_colate_cs。 – georgecj11 2013-03-19 16:09:50

+0

natas是一種道德黑客操場。你得到一個挑戰,你應該以某種方式打破。這樣做的目的是爲了強制它。 – 2013-03-19 16:10:04

回答

3

是否LIKE=動作中的情況下,敏感的方式將你正在做的所述比較的字段的排序規則來確定。如果你的字段有一個非區分大小寫的排序規則(就像我猜你的那樣),那麼你會得到不區分大小寫的比較結果。如果該字段具有二進制或區分大小寫的排序規則,或者如果在比較時使用BINARY關鍵字強制進行二進制比較,則會得到區分大小寫的比較結果。

+0

謝謝,我想這是唯一的解釋。由於我不能直接看到數據庫模式,我會猜測這是發生了什麼。此外,這是一個常見的陷阱?我的意思是我一直認爲無論如何文本比較都區分大小寫。 – 2013-03-19 16:13:30

+0

@AhmedAeonAxan如果你不明白排序規則是如何工作的,我想這可能是一個陷阱,因爲你的應用程序肯定會得到意想不到的結果。不知道它有多常見的問題。大多數實際上並沒有以明文形式將密碼存儲在數據庫中,而是將其散列在具有全部小寫字母(如md5散列或類似形式)的介質中,以便區分大小寫不成問題。 – 2013-03-19 16:17:37

+0

是的,我很喜歡那個。我編輯了我的帖子以包含此內容。這是納塔斯水平的一部分。它基本上是一個帶有某種你應該利用的漏洞的沙箱。所以這遠非真實世界的應用。正因爲如此,我無法準確地看到他們的數據庫模式。但你的回答完全描述了行爲所以我想這一定是它。 – 2013-03-19 16:20:31