PDO 错误/通知中的哈希密码

Posted

技术标签:

【中文标题】PDO 错误/通知中的哈希密码【英文标题】:Hash Password in PDO Error/Notice 【发布时间】:2016-11-22 14:16:38 【问题描述】:

如果我运行它,我会收到以下错误:

注意:只有变量应该在第 11 行的 /var/www/interface/register.php 中通过引用传递 成功

我不知道如何解决这个问题。还是成功了,数据在数据库中被hash了,但是我不想要这个通知。

$sql = " INSERT INTO users (username, password) VALUES (:username, :password)";
    $stmt = $conn->prepare($sql);

    $stmt->bindParam(':username', $_POST['username']);
    $stmt->bindParam(':password', password_hash($_POST['password'], PASSWORD_BCRYPT));


    if ($stmt->execute()) :
        die('Success');
    else:
        die('Fail');
    endif;

提前致谢。

【问题讨论】:

请改用PDOStatement::bindValue()。或者只使用PDOStatement::execute() 【参考方案1】:

你不能在bindParam里面做password_hash($_POST['password'], PASSWORD_BCRYPT),因为password_hash返回一个字符串,这样做:

$password = password_hash($_POST['password'], PASSWORD_BCRYPT);
$stmt->bindParam(':password', $password);

如果您希望将值保留在那里,请使用 bindValue:

$stmt->bindValue(':username', $_POST['username']);
$stmt->bindValue(':password', password_hash($_POST['password'], PASSWORD_BCRYPT));

因为它允许引用变量。

解释:

bindParam 需要一个变量或 const 它不能是原始类型,例如字符串或 int,...,显式(例如:“some_hardcoded_string”)也不能是函数返回其中一种类型。

bindValue 可以接收引用和原始类型作为参数。


两者的示例:

$query->bindParam(':user', $user, PDO::PARAM_STR);

$query->bindValue(':pass', sha1($password), PDO::PARAM_STR);

SHA1 是返回一个值,它可能是一个数字 12345(为了示例而假设)

$query->bindValue(':pass', 12345, PDO::PARAM_STR); 

或一个字符串。

$query->bindValue(':pass', 'hashed_password', PDO::PARAM_STR);

相关问题:

Strict Standards: Only variables should be passed by reference in m_auth PDO pass by reference notice? Strict Standards: Only variables should be passed by reference

【讨论】:

以上是关于PDO 错误/通知中的哈希密码的主要内容,如果未能解决你的问题,请参考以下文章

PHP PDO如何在注册时对密码进行哈希处理,然后在登录时“取消哈希”

学习PDO中的错误与错误处理模式

与密码验证错误问题验证[复制]

尝试使用 PDO 连接到错误的数据库时 PHP 不显示错误

使用 Spring Security BCryptPasswordEncoder 对密码进行哈希处理时凭据错误

与 PHP PDO 相比,Doctrine DBAL 中的错误处理