2012-12-20 2 views
2

Я делаю пароль и имя пользователя для входа в запрос и выглядит следующим образомMySQL запросов игнорирование капитализации

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

я прохожу в мое имя пользователя и пароль. Проблема в том, что, скажем, у меня есть имя пользователя «user», а пароль - «пароль». Когда я ввожу «user» и «Password» в поля, они возвращаются с результатом. Таким образом, капиталы бесполезны. Я делаю что-то неправильно? есть ли лучший способ сделать это? Проблема с капиталом одинакова для имени пользователя. Это похоже на то, что он выполняет совпадение, когда мне нужно точное совпадение строк. Я тоже пытался использовать бинарные файлы в надежде, что это может изменить его, но те же результаты.

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

Как передать свои переменные этому запросу? И каков тип ваших таблиц? –

+1

Пароль должен быть хэширован (и солен), и в этом случае хэш-регистр не имеет значения, но хэш будет генерироваться только паролем правильного случая. –

+0

Что такое сортировка 'users'? – hek2mgl

ответ

4

Из MySQL documentation:

Простых операций сравнения (> =,> =, <, < =, сортировка и группировка) основаны на каждый персонаж символы с «значением сортировки.» то же значение сортировки трактуется как один и тот же символ. Например, если «e» и «é» имеют одинаковое значение сортировки в заданной сортировке, они сравниваются как равные.

Набор символов по умолчанию и сортировка по умолчанию - latin1 и latin1_swedish_ci, поэтому неважные сравнения строк по умолчанию нечувствительны к регистру. Это означает, что при поиске с col_name LIKE 'a%' вы получаете все значения столбцов, начинающиеся с A или a. Чтобы сделать этот регистр чувствительным, убедитесь, что один из операндов имеет чувствительную к регистру или двоичную сортировку. Например, если вы сравниваете столбец и строку, оба имеют latin1 набор символов, вы можете использовать оператор СОРТ- вызвать либо операнд иметь 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

0 коммент. see here for information on case sensitivity in MySQL

Возможно, вы используете двоичную сортировку для имен пользователей и паролей в любом случае.

Примечательно:

Чтобы сделать этот поиск чувствителен к регистру, убедитесь, что один из операндов имеют регистрозависимые или бинарные сортировки.

также

Если вы хотите столбец всегда быть судимым в случае чувствительных к моде, объявит его с случае чувствительной или бинарной сортировкой. См. Раздел 13.1.10, «Синтаксис CREATE TABLE».

Кроме того, в идеале, вы должны засовывать и хэшировать свои пароли как минимум. После этого вы солите и хеш введите пароль пользователя при входе в систему. Хранение паролей с открытым текстом - это плохая практика, и ее следует избегать.

Смежные вопросы