在PDO准备好的语句中验证password_hash()

施密茨

我正在尝试使用bcrypt算法对密码进行哈希处理,但是遇到了两个问题。首先,我找不到合适的位置来检查是否password_verify()返回true。

$admin = $_POST['admin-user'];
$pass = $_POST['admin-pass'];

$password_hash = password_hash($pass, PASSWORD_BCRYPT);

if (isset($admin)&&isset($pass)&&!empty($admin)&&!empty($pass)) {

$admin_select = $link->prepare("SELECT `id` FROM `admins` WHERE `username` = :admin");

$admin_passwd = $link->prepare("SELECT `password` FROM `admins` WHERE `username` = :admin_pw");
$admin_passwd->execute(array(':admin_pw' => $admin));
$admin_pwd = $admin_passwd->fetch(PDO::FETCH_ASSOC);

    if (password_verify($pass, $admin_pwd)){

            if ($admin_select->execute(array(':admin' => $admin))) {
                $res = $link->query('SELECT COUNT(*) FROM requests');
                $query_num_rowz = $res->fetchColumn();
            if ($query_num_rowz == 0) {
                echo 'No records found';
            } else if ($query_num_rowz > 0) {
                $query = $link->prepare("SELECT id FROM admins WHERE username = :admin");
                 $query->execute(array(':admin' => $admin));
                 $admin_id = $query->fetch(PDO::FETCH_ASSOC);
                $_SESSION['admin_id'] = $admin_id;
                header('Location: index.php');
            }
        }
    }
}

第二,我不确定这是选择用户密码的正确方法。

$admin_passwd = $link->prepare("SELECT `password` FROM `admins` WHERE `username` = :admin_pw");
$admin_passwd->execute(array(':admin_pw' => $admin));
$admin_pwd = $admin_passwd->fetch(PDO::FETCH_ASSOC);
凯文

由于您没有放入->fetch循环,因此单次调用将返回单行关联数组。您必须首先访问适当的索引(在这种情况下为password)。然后,将内的行值(至少已被散列)password_verify与用户输入进行比较。粗略的例子:

if(!empty($_POST['admin-user'] && !empty($_POST['admin-pass']))) {
    $admin = $_POST['admin-user'];
    $pass = $_POST['admin-pass'];

    $admin_info = $link->prepare("SELECT `password` FROM `admins` WHERE `username` = :admin_user");
    $admin_info->execute(array(':admin_user' => $admin));
    $row = $admin_info->fetch(PDO::FETCH_ASSOC);

    if(!empty($row)) {
        // check if the hashed row password
        if(password_verify($pass, $row['password'])) {
            // okay
        }
    } else {
        // not found
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从准备好的语句中获取文本(PHP,PDO)

来自分类Dev

计算PDO准备好的语句中的行数

来自分类Dev

在准备好的语句中准备失败

来自分类Dev

准备好的语句中的异常

来自分类Dev

准备好的语句中的异常

来自分类Dev

准备好的语句中的$ row [''] PHP

来自分类Dev

检查准备好的语句PDO的结果?

来自分类Dev

PDO语句在准备好的语句中为字符串值插入整数

来自分类Dev

PDO如何在准备好的语句中将datetime值设置为NULL?

来自分类Dev

PDO如何在准备好的语句中将datetime值设置为NULL?

来自分类Dev

“在准备好的语句中未提供参数数据”

来自分类Dev

在PHP准备好的语句中插入日期

来自分类Dev

在MySQLi准备好的语句中,STMT代表什么?

来自分类Dev

准备好的sql语句中的int的Python列表

来自分类Dev

准备好的SQL语句中的NodeJS MSSQL WHERE

来自分类Dev

从mysqli准备好的语句中选择随机行

来自分类Dev

在准备好的语句中设置一行null

来自分类Dev

在准备好的语句中使用列表

来自分类Dev

如何在准备好的语句中设置列表

来自分类Dev

SQL =如果准备好的语句中不存在?

来自分类Dev

在准备好的语句中提取数组时出错

来自分类Dev

从准备好的语句中获取表名

来自分类Dev

在准备好的语句中获取列名而不是值

来自分类Dev

在 PHP MySQLi 准备好的语句中结合 LIKE 和 IN

来自分类Dev

准备好的语句在 LIKE 子句中缺少绑定变量

来自分类Dev

php mysqli在准备好的语句中重复字段

来自分类Dev

PDO准备好的语句fetch()返回双精度结果

来自分类Dev

向准备好的SQL语句PDO添加偏移

来自分类Dev

PDO准备好的语句不返回记录

Related 相关文章

热门标签

归档