如何使用PDO和Phpass根据数据库检查登录信息
我试图检查用户散列密码与我保存在数据库中的密码。这几乎与问题相同,但我正在尝试使用PDO来实现,我不确定如何从数据库中获取哈希密码以进行检查。以下是我目前登录页面的代码:如何使用PDO和Phpass根据数据库检查登录信息,php,mysql,login,pdo,phpass,Php,Mysql,Login,Pdo,Phpass,我试图检查用户散列密码与我保存在数据库中的密码。这几乎与问题相同,但我正在尝试使用PDO来实现,我不确定如何从数据库中获取哈希密码以进行检查。以下是我目前登录页面的代码: <?php ini_set('display_errors', 1); error_reporting(E_ALL); ini_set('display_errors', 1); require_once "/home/carlton/public_html/PHPproject/includes/PasswordHa
<?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
}
?>
这很简单
您必须先选择存储的密码,然后验证它。伪代码:
$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
}
hash calc函数可以像
md5($posted_passwd)
一样简单,但最好的做法是对hash进行加密,以便相同的密码为不同的用户和/或在不同的系统上生成不同的hash。确保在数据库中存储密码哈希时使用相同的哈希函数。这是我的登录工作代码,以防其他人遇到类似问题。我要找的信息在第20行,从$response开始。这允许我从数据库中获取密码,我将其设置为$stored_hash。然后,我可以使用PHPass中的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
}
?>
用户名:
密码:
提交
重置表单
您实际上只是将数据库中的哈希密码与输入的密码进行比较,一旦它也进行了类似的哈希处理
- 首先,不要使用
帐户访问数据库root
- 尽量避免选择*——只需选择实际需要的列即可
- 令牌的数量(
)必须等于查询中绑定参数的数量(:username
)。否则PDO将抛出一个错误':username'=>$username
- 您还没有发布处理密码验证本身的类,但它基本上只是对输入进行散列并比较两者,返回bool
- 顺便说一句,
是用来回显变量的值,尤其是数组的值。如果只是回显字符串作为响应,那么只需print\r
或print
即可echo