【发布时间】: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->rowCount() 返回的值为 0 ,找不到我要找的密码,谁能告诉我为什么?如何解决这个问题?
其他细节:
PHP 版本:5.4
操作系统:Ubuntu 12.04 64 位 谢谢
【问题讨论】:
-
重复测试,但不要使用
$pdo->bindValue(':password', $p);,而是使用$pdo->bindValue(':password', '12345'); -
您是否在之前存储其哈希后寻找文字密码?为什么会有
addslashes? -
您是否也尝试使用
$pdo->bindValue(':password', $p, PDO::PARAM_LOB);? -
烧掉那本书。您正在使用准备好的语句。不需要额外的转义。特别是不完全愚蠢的转义函数,如 addlashes,它们不适用于数据库上下文。
-
@mario 实际上是我的错,因为这本书使用 mysqli .. 是的,伙计们,感谢您的帮助和提示。为什么如果我使用 PDO::PARAM_LOB 它可以工作(在我使用 addlashes() 时)?我知道使用 PDO::PARAM_LOB 和 addlashes 而不是仅仅删除 addlashes 是不必要的,但我只是好奇