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

标签 php mysql sql

我应该通过在 SQL 表中搜索来验证用户名和密码,还是应该找到用户名然后将密码与 PHP if 语句进行匹配?

  1. SELECT * FROM 表,其中用户名 = $用户名 AND 密码 =$密码

  2. SELECT * FROM 表,其中用户名 = $用户名 ...

    if ($row[密码] == $密码) { 做东西 }

哪种方法更安全、更高效?

最佳答案

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

$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 .

关于php - 哪种方法更好地验证用户凭据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38782603/

相关文章:

PHP:警告:mysql_fetch_array() 期望参数 1 为资源

sql - 在Delphi 7中运行更新查询时,如何解决封闭数据集错误?

sql - 查找具有唯一列的所有行,仅查找最新的

php - 尽管时区有效,但设置默认时区不起作用

php - 我想将多个复选框选定的选项保存到 MySQL 中

php - 如何选择用户好友帖子和用户帖子

mysql - MySQL Query IF ELSEIF ELSE 的写法

php - "Content type"数据库字段

java - 使用从 sql 数据库中提取的方法返回的多维数组

mysql - 数据库设计。一对多还是多对多?