-1

我正在尝试根据我保存在数据库中的密码来检查用户散列密码。这和这个人几乎是一样的问题,但我正在尝试用 PDO 来做,我不确定如何从数据库中获取散列密码来检查它。到目前为止,这是我登录页面的代码:

<?php
ini_set('display_errors', 1);
error_reporting(E_ALL); ini_set('display_errors', 1);

require_once "/home/carlton/public_html/PHPproject/includes/PasswordHash.php";

if ($_POST){
$form = $_POST;
$username = $form['username'];
$password = $form['password'];


try{
    $db = new PDO('mysql:host=localhost;dbname=phpproject', 'root', 'pdt1848!');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
    catch(PODException $e){
        echo "Can't connect to the database";
    }
$sql = "SELECT * FROM users WHERE username=:username";
$query = $db->prepare($sql);
$query->execute(array(':username'=>$username, ':password'=>$stored_hash));
$results = $query->fetchAll(PDO::FETCH_ASSOC);


$check = $hash_obj->CheckPassword($password, $stored_hash);
if($check){
    print_r("Registered user");
}
else{
    print_r("Not a registered user");
}


//login here
} 
else{
?>
<form name="login" action="login.php" method="POST">
<label for "username">Username: </label>
<input type="text" name="username"/><br />
<label for "password">Password: </label>
<input type="password" name="password"/><br />
<button type="submit">Submit</button>
<button type="reset">Reset Form</button>
</form>
<?php
}
?>
4

4 回答 4

1

这很简单。

您必须先选择存储的密码,然后再进行验证。

于 2014-04-29T06:10:13.280 回答
0

伪代码:

$q=$db->prepare('SELECT * FROM usertable WHERE username=? AND passwordhash=?');

$thehashvalue=calc_hash_of_password_according_to_your_agorithm($params);
$theusername=the_username_that_was_posted();

$q->execute(array($theusername, $thehashvalue));

$lastlogin=null;
while($r=$q->fetch(PDO::FETCH_ASSOC)) {
   # successfully authenticated
   $lastlogin=$r['lastlogin']; ## example. assumes a "lastlogin" column on "usertable"
}

if(!empty($lastlogin)) {
   # user is logged in
}else{
  # login failed
}

哈希计算函数可能很简单,md5($posted_passwd)但最好对哈希进行加盐,以便相同的密码为不同的用户和/或不同的系统生成不同的哈希。只需确保在数据库中存储密码哈希时使用相同的哈希函数。

于 2014-04-29T14:05:15.457 回答
0

您实际上只是在比较数据库中的散列密码与输入的密码是否匹配,一旦它也经过类似的散列。

  • 首先,不要使用该root帐户访问您的数据库
  • 尽量避免SELECT *- 只需选择您实际需要的列。
  • 标记 ( :username) 的数量必须等于':username'=>$username查询中绑定参数 ( ) 的数量。否则 PDO 将抛出错误。
  • 您尚未发布处理密码验证本身的类,但它基本上只是对输入进行哈希处理并比较两者,返回一个布尔值。
  • 顺便说一句,print_r就是回显变量的值,特别是数组。如果您只是回显一个字符串作为响应,那么就print可以echo了。
于 2014-05-02T01:31:10.743 回答
-1

这是我的登录工作代码,以防其他人遇到类似问题。我要查找的信息位于第 20 行,以 $response 开头。这使我可以从数据库中获取密码,我将其设置为 $stored_hash。然后我可以使用 PHPPass 中的 CheckPassword 函数进行比较。

<?php
session_start();
ini_set('display_errors', 1);
error_reporting(E_ALL); ini_set('display_errors', 1);

require "/home/carlton/public_html/PHPproject/includes/PasswordHash.php";

if ($_POST){
    $form = $_POST;
    $username = $form['username'];
    $password = $form['password'];
    $hash_obj = new PasswordHash(8, false);

    try{
        $db = new PDO('mysql:host=localhost;dbname=phpproject', 'carl', 'pdt1848?');
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
        catch(PODException $e){
            echo "Can't connect to the database";
        }
    $response = $db->query("SELECT password FROM users WHERE username='$username'");
    $data=$response->fetch();
    $stored_hash = $data['password'];

    $check = $hash_obj->CheckPassword($password, $stored_hash);
    if($check){
        echo "Login successful!";
        $_SESSION['logged_in'] = true;
    }
    else{
        echo "Authentication failed. Please try again.";
    }


    //login here
}
else{
?>
<form name="login" action="login.php" method="POST">
    <label for "username">Username: </label>
    <input type="text" name="username"/><br />
    <label for "password">Password: </label>
    <input type="password" name="password"/><br />
    <button type="submit">Submit</button>
    <button type="reset">Reset Form</button>
</form>
<?php
}
?>
于 2014-05-02T01:22:48.017 回答