哪种方法更好地验证用户凭据?

时间:2016-08-05 06:33:00

标签: php mysql sql

我是否应该通过在SQL表中搜索两者来验证用户名并传递单词?或者我是否应该找到用户名然后将密码与PHP if语句匹配?

  1. SELECT * FROM table WHERE username = $username AND password =$password

  2. SELECT * FROM table WHERE username = $username ...

    if ($row[password] == $password) { do stuff }

  3. 哪种方法更安全有效?

2 个答案:

答案 0 :(得分:2)

事情是......你应该在数据库中store salted, hashed passwords。由于每个用户/密码单独加盐,因此您无法直接使用password = ?查找它们,因为您不知道盐,因此无法提前计算匹配的哈希值。如果您正确执行此操作,则 必须 首先按用户名获取用户记录,然后使用检索到的salt / hash验证密码哈希。伪代码:

$user = fetch_from_database($_POST['username']);

if (!$user) {
    throw new Exception("User doesn't exist");
}

if (!password_verify($_POST['password'], $user['password_hash'])) {
    throw new Exception('Invalid password');
}

echo 'Welcome ', $user['name'];

请参阅http://php.net/password_hashhttp://php.net/password_verify

答案 1 :(得分:-1)

从上面列出的2中,第二个更安全,因为第一个更倾向于SQL注入。

SELECT * FROM table WHERE username = $username AND password =$password

在此代码中,如果输入的用户名和密码的值类似于" a或(' a' =' a')" 代码将被修改为

SELECT * FROM table WHERE username = a or ('a' = 'a') AND password = a or ('a' = 'a')

这意味着列出所有数据的清晰代码。

而在第二种情况下,IF条件仅将该值视为单个字符串。所以第二个是你提到的2个中最好的..

希望这有帮助