考虑以下查询,该查询返回相同的输出,即用户名是否无效或密码是否错误(仅举一个例子,我知道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}'));

我将用什么替换<salt_field>

最佳答案

你可以随意查阅任何专栏。在这种情况下,您可以使用WHERE password = SHA1(CONCAT(salt, <password>))。请注意,仍然可以嗅探密码。相信环境就看你了。下面的查询是一个很好的示例,但用处不大:WHERE lastName = username。在这种情况下,您将比较用户的姓氏和他们选择的用户名。因此在本例中,它将返回所有用户名与姓氏相同的用户。
当连接多个表时也会发生这种情况。实际上,可以将第一个表的所有行与第二个表中的行连接起来,但只返回与给定条件匹配的行。聪明的优化将导致不考虑所有可能的组合,而只是其中的一小部分。

关于mysql - 在concat中使用储存的盐,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15050883/

10-16 13:21