在concat中使用储存的盐

时间:2013-02-24 10:36:35

标签: mysql

考虑以下查询返回相同的输出,无论用户名是无效还是密码错误(只是一个例子,我知道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}}代替什么?

1 个答案:

答案 0 :(得分:1)

您可以根据需要参考任何列。在这种情况下,您可以使用WHERE password = SHA1(CONCAT(salt, <password>))。请注意,密码仍然可以被嗅探。如果您信任环境,这取决于您。一个很好的例子,但不太有用,是以下查询:WHERE lastName = username。在这种情况下,您将比较用户的姓氏和他们选择的用户名。因此,在这种情况下,它将返回与其姓氏具有相同用户名的所有用户。

当您连接多个表时也会发生这种情况。实际上,您将第一个表的所有行与第二个表中的行连接起来,但只返回与给定条件匹配的行。聪明的优化将导致不考虑所有可能的组合,但只是其中的一小部分。