【问题标题】:php PDO query doesn't work with hash_hmac()php PDO 查询不适用于 hash_hmac()
【发布时间】:2013-03-10 14:32:30
【问题描述】:

我刚刚读到了 hash_hmac() 函数, 我试图用它在数据库中存储密码:

<?php
$dsn = 'mysql:host=localhost;dbname=test';
$username = 'root';
$pass = 'password';

$conn = new PDO($dsn, $username, $pass);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->setAttribute(PDO::ATTR_PERSISTENT, TRUE);

$password = '123MonyeTSahuR456';

    $p = addslashes(hash_hmac('sha256', $password, '13#slP3mK;"dA$@m', TRUE));    

    $query = "INSERT INTO table_one VALUES(NULL, :password)";

try
{
    $pdo = $conn->prepare($query);
    $pdo->bindValue(':password', $p);

    if($pdo->execute())
    {
        echo $pdo->rowCount();
    }
    else
    {
        echo 'fail';    
    }
}
catch(PDOException $e)
{
    echo $e->getMessage();
}

数据库详情:

id INT NOT NULL AUTO INCREMENT
password VARBINARY(32) NOT NULL

之后,我手动检查了我的数据库,发现一行包含 BLOB(我以前从不使用/使用 VARBINARY 或 BLOB 数据类型,所以这是我的第一次)

所以存在 1 行,我尝试选择该行:

    $query = "SELECT * FROM table_one WHERE password = :password";

pdo-&gt;rowCount() 返回的值为 0 ,找不到我要找的密码,谁能告诉我为什么?如何解决这个问题?

其他细节:

PHP 版本:5.4

操作系统:Ubuntu 12.04 64 位 谢谢

【问题讨论】:

  • 重复测试,但不要使用$pdo-&gt;bindValue(':password', $p);,而是使用$pdo-&gt;bindValue(':password', '12345');
  • 您是否在之前存储其哈希后寻找文字密码?为什么会有addslashes
  • 您是否也尝试使用$pdo-&gt;bindValue(':password', $p, PDO::PARAM_LOB);
  • 烧掉那本书。您正在使用准备好的语句。不需要额外的转义。特别是不完全愚蠢的转义函数,如 addlashes,它们不适用于数据库上下文。
  • @mario 实际上是我的错,因为这本书使用 mysqli .. 是的,伙计们,感谢您的帮助和提示。为什么如果我使用 PDO::PARAM_LOB 它可以工作(在我使用 addlashes() 时)?我知道使用 PDO::PARAM_LOB 和 addlashes 而不是仅仅删除 addlashes 是不必要的,但我只是好奇

标签: php hash pdo sha


【解决方案1】:

已解决

通过在查询中使用 PDO::PARAM_LOB,它可以工作..

我想到的还有 1 件事:

  • 我应该在查询前使用addslashes() 吗?我只是按照addslashes() 的教程进行操作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-16
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    相关资源
    最近更新 更多