考虑以下查询返回相同的输出,无论用户名是无效还是密码错误(只是一个例子,我知道SQL注入):
CREATE TABLE users (
username VARCHAR(64),
password CHAR(40)
);
SELECT FROM users
WHERE username = '{$username}'
AND password = sha1('{$password}');
我想添加一个salt字段,但不是在应用程序中检索它并连接,我宁愿MySQL在引擎中进行连接:
CREATE TABLE users (
username VARCHAR(64),
salt VARCHAR(128),
password CHAR(40)
);
SELECT FROM users
WHERE username = '{$username}'
AND password = sha1(CONCAT(<salt_field>, '{$password}'));
我会用{<1}}代替什么?
答案 0 :(得分:1)
您可以根据需要参考任何列。在这种情况下,您可以使用WHERE password = SHA1(CONCAT(salt, <password>))
。请注意,密码仍然可以被嗅探。如果您信任环境,这取决于您。一个很好的例子,但不太有用,是以下查询:WHERE lastName = username
。在这种情况下,您将比较用户的姓氏和他们选择的用户名。因此,在这种情况下,它将返回与其姓氏具有相同用户名的所有用户。
当您连接多个表时也会发生这种情况。实际上,您将第一个表的所有行与第二个表中的行连接起来,但只返回与给定条件匹配的行。聪明的优化将导致不考虑所有可能的组合,但只是其中的一小部分。