我不完全确定如何描述这一点,所以最简单的方法是使用测试用例。运行以下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 )
答案 0 :(得分:0)
答案 1 :(得分:0)
检查没有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子句时,此值将转换为boolean;在您的情况下,值'11VKs9AZ4WOfc'为TRUE,但'aaBrLCcg4bKmQ'为FALSE。
这是一个可以解释这种行为的小例子 -
SELECT 'A' = TRUE, '1' = TRUE;
+------------+------------+
| 'A' = TRUE | '1' = TRUE |
+------------+------------+
| 0 | 1 |
+------------+------------+
我认为你的一些值被转换为TRUE,有些则被视为FALSE。