MySQL Encrypt возвращает true в неправильном поле с числами в виде соли - PullRequest
0 голосов
/ 03 октября 2011

Я не совсем уверен, как это описать, поэтому самый простой способ - это тестовый пример. Запуск следующего sql вернет три строки в select. Мое понимание шифрования говорит мне, что это не должно возвращать никаких строк.

Это происходит только тогда, когда соль начинается с двух чисел.

Пожалуйста, также игнорируйте тот факт, что шифрование называется как оно есть. Это устаревшее приложение, и мне нужно понять, что происходит, прежде чем вносить изменения.

CREATE TABLE IF NOT EXISTS `test` (
  `user` varchar(10) NOT NULL,
  `pass` varchar(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


INSERT INTO `test` (`user`, `pass`) VALUES
('user', '11');
INSERT INTO `test` (`user`, `pass`) VALUES
('user', '22');
INSERT INTO `test` (`user`, `pass`) VALUES
('user', '33');
INSERT INTO `test` (`user`, `pass`) VALUES
('user', 'aa');


SELECT *
FROM `test`
WHERE encrypt( 'user', test.pass )

Ответы [ 2 ]

0 голосов
/ 03 октября 2011

Проверить вывод без предложения WHERE -

SELECT *, ENCRYPT('user', pass) FROM test;
+------+------+-----------------------+
| user | pass | ENCRYPT('user', pass) |
+------+------+-----------------------+
| user | 11   | 11VKs9AZ4WOfc         |
| user | 22   | 22QsW1gRCcd2I         |
| user | 33   | 33PLcxSqvhZnc         |
| user | aa   | aaBrLCcg4bKmQ         |
+------+------+-----------------------+

При использовании предложения WHERE эти значения преобразуются в логические;в вашем случае значение '11VKs9AZ4WOfc' равно TRUE, а 'aaBrLCcg4bKmQ' равно FALSE.

Вот небольшой пример, который может объяснить это поведение -

SELECT 'A' = TRUE, '1' = TRUE;
+------------+------------+
| 'A' = TRUE | '1' = TRUE |
+------------+------------+
|          0 |          1 |
+------------+------------+

Я думаю, некоторые из ваших значенийснимаются как ИСТИНА, а некоторые как ЛОЖЬ.

0 голосов
/ 03 октября 2011

Здесь четко упоминается

Если crypt () не доступен в вашей системе (как в случае с Windows), ENCRYPT () всегда возвращает NULL.

, поэтому сначала убедитесь, что crypt() доступен или нет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...