mysqli使用预准备语句

时间:2016-09-08 15:58:52

标签: mysqli hash passwords

我想通过使用mysqli prepare语句搜索散列密码来从表中获取user_id。

我知道准备好的陈述是如何运作的,例如

$query = "SELECT `colour` FROM `pallet`";
$query.=" Where `colour`=? "
$stmt = $db->prepare($query);
$stmt->bind_param('s',$colour="blue");
$stmt->execute();
$stmt->bind_result($colour);
    while($stmt->fetch())
snip

所以我对准备好的语句没有问题,但问题是这与我的哈希密码相匹配,我必须输入密码

$input_password = crypt($password,$database_pass);

并在匹配之前将其哈希。所以我想我会尝试这样的事情

$query = "SELECT `password` FROM `log`";
$query.=" Where `password`=? "
$stmt = $db->prepare($query);
$stmt->bind_param('s',crypt($password,$database_pass));
$stmt->execute();
$stmt->bind_result($colour);

显然这不起作用,因为我需要在绑定之前从数据库中获取$ database_pass。我想一气呵成。

在此之前,我没有使用准备好的表,我只是获取密码并在循环中检查它们,但我希望通过一次性完成所有操作来改善这一点。

我总是以一种方式解决问题,然后再尝试改进它,但我对这个方法有困难。

好的我已经设法以不同的方式做到了,但我的新代码的问题是它必须先阅读整个表才能进行比较。我宁愿用where子句来做,因为它只获取它需要的数据。

       Global $db;
        $query = "SELECT `temp_pass`,`user_id` FROM `".$database."`.`logon`";
        $stmt = $db->prepare($query);
        $stmt->execute();
        $stmt->bind_result($temp_pass,$user_id);
        while ($stmt->fetch()) {
$input_password = crypt($password,$temp_pass);  
            if($input_password == $temp_pass):
                return $user_id;
                break;
            endif;
        }

1 个答案:

答案 0 :(得分:1)

人们无法在数据库中搜索正确的盐渍密码,问题就在于你所描述的:要计算一个可比较的密码哈希,你需要先得到盐,这是因为你找不到散列。

这适用于密码哈希,但是如果您有密码重置的强令牌,那么另一件事就是。如果令牌足够强大,您可以存储未加保证的哈希值(例如SHA-256)以及您可以在数据库中找到的哈希值。