2012-12-20 114 views
2

我做用戶名和密碼登錄查詢,它看起來像這樣MySQL查詢忽略大小寫

$query = "SELECT id FROM users WHERE username = ? AND password = ?"; 

我通過我的用戶名和密碼。問題是,說我有一個用戶名'用戶'和他們的密碼'密碼'。當我輸入'用戶'和'密碼'到領域它返回與結果仍然。所以這使得首都無用。難道我做錯了什麼?有沒有更好的方法去做這件事?資金問題對於用戶名是一樣的。它就像它正在做一個模式匹配,當我想要一個確切的字符串匹配。我也試過二進制,希望它可能改變了它,但結果相同。

$stmt = $this->db->prepare($query); 
$stmt->bind_param("ss", $user, $pass); 
$stmt->execute(); 
+1

你如何通過你的變量來此查詢?你的桌子的類型是什麼? –

+1

在這種情況下,密碼應該被散列(並被鹽化),而散列情況並不重要,但散列只能由正確大小寫的密碼生成。 –

+0

「用戶」的排序規則是什麼? – hek2mgl

回答

4

MySQL documentation

簡單的比較操作(> =,>,=,<,< =,排序和分組)基於每個字符與字符「排序值」。相同的排序值被視爲相同的字符。例如,如果「e」和「é」在給定的歸類中具有相同的排序值,則它們會相等。

缺省字符集和排序規則是latin1和latin1_swedish_ci,所以非二進制字符串比較默認情況下不區分大小寫。這意味着如果使用col_name LIKE'a%'進行搜索,則會獲得以A或a開頭的所有列值。要使搜索區分大小寫,請確保其中一個操作數具有區分大小寫或二進制排序規則。例如,如果您比較一列和一個字符串,都有latin1字符集,你可以使用COLLATE操作符,使操作具有latin1_general_cs或latin1_bin校對特性:

你應該改變的整理將您的表或列轉換爲區分大小寫的內容或使用二進制排序規則。

2

這是一個典型的校對問題。 默認排序規則比較不區分大小寫。您應該使用二進制排序規則進行比較。

默認UTF8歸類

mysql> SELECT 'password' COLLATE utf8_unicode_ci = 'PASSWORD' COLLATE utf8_unicode_ci; 
+-------------------------------------------------------------------------+ 
| 'password' COLLATE utf8_unicode_ci = 'PASSWORD' COLLATE utf8_unicode_ci | 
+-------------------------------------------------------------------------+ 
|                  1 | 
+-------------------------------------------------------------------------+ 
1 row in set (0.00 sec) 

UTF8二進制排序

mysql> SELECT 'password' COLLATE utf8_bin = 'PASSWORD' COLLATE utf8_bin; 
+-----------------------------------------------------------+ 
| 'password' COLLATE utf8_bin = 'PASSWORD' COLLATE utf8_bin | 
+-----------------------------------------------------------+ 
|               0 | 
+-----------------------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT 'password' COLLATE utf8_unicode_ci = 'password' COLLATE utf8_unicode_ci; 
+-------------------------------------------------------------------------+ 
| 'password' COLLATE utf8_unicode_ci = 'password' COLLATE utf8_unicode_ci | 
+-------------------------------------------------------------------------+ 
|                  1 | 
+-------------------------------------------------------------------------+ 
1 row in set (0.00 sec) 

更改您的查詢

$query = "SELECT id FROM users WHERE username = ? AND password COLLATE utf8_bin = ?"; 

閱讀更多有關排序規則在這裏:

https://dev.mysql.com/doc/refman/5.5/en/charset-general.html

2

您使用的是什麼排序規則? see here for information on case sensitivity in MySQL

您應該使用二進制排序規則來處理用戶名和密碼列。

值得注意的是:

使搜索區分大小寫,請確保操作數之一具有區分大小寫的或二進制校對。

如果你想總是在區分大小寫的方式處理列,可使用區分大小寫的或二進制校對聲明它。請參見第13.1.10節「CREATE TABLE語法」。

此外,理想情況下,您應該至少醃製和散列密碼。在進行比較時,您可以在登錄時使用用戶提供的密碼進行哈希和散列。存儲明文密碼是不好的做法,應該避免。