我是否应该通过在SQL表中搜索两者来验证用户名并传递单词?或者我是否应该找到用户名然后将密码与PHP if语句匹配?
SELECT * FROM table WHERE username = $username AND password =$password
SELECT * FROM table WHERE username = $username
...
if ($row[password] == $password)
{
do stuff
}
哪种方法更安全有效?
答案 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_hash,http://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个中最好的..
希望这有帮助