1

考虑以下查询,无论用户名无效还是密码错误,它都会返回相同的输出(只是一个示例,我知道 SQL 注入):

CREATE TABLE users (
    username VARCHAR(64),
    password CHAR(40)
);

SELECT FROM users
      WHERE username = '{$username}'
        AND password = sha1('{$password}');

我想添加一个盐字段,但不是在应用程序中检索它并连接,我更希望 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>

4

1 回答 1

1

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

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

于 2013-02-24T11:25:50.423 回答