我正在开发一个web应用程序,该应用程序要求用户登录才能访问内容。我是新的PHP,所以我试图弄清楚如果有我的代码有问题,当我试图从数据库检索信息。
<?php
include('./connection.php');
$loginInfo = json_decode(file_get_contents('php://input'));
$username = $loginInfo->username;
$password = password_hash($loginInfo->password, PASSWORD_DEFAULT);
$q = $db->prepare("SELECT * FROM userauth WHERE username=:username AND password=:password");
$q->bindParam(':username', $username, PDO::PARAM_STR);
$q->bindParam(':password', $password, PDO::PARAM_STR);
$q->execute();
$userRow=$q->fetch(PDO::FETCH_ASSOC);
if($userRow == true){
print 'success';
}else{
print 'error';
}
?>
这是Angular的Service:
'use strict';
app.factory('loginSrv', function($http,$location){
return{
login:function(loginInfo, scope){
var $promise = $http.post('../app_back_end/app_endpoints/login.php', loginInfo);
$promise.then(function(msg){
if(msg.data == 'success'){
console.log('success login');
$location.path('/profile');
}
else {
console.log('error login');
scope.msgtxt = 'Want to try again? :)';
}
});
}
}
});
password_hash()
不会从相同的输入生成两次相同的结果。
因此,即使输入的密码与最初输入的密码相同,当您对其进行散列时,您也不会得到相同的散列。
这就是password_verify()
被发明的目的,所以只使用用户名进行搜索,然后使用password_verify()
检查密码是否相同。
<?php
include('./connection.php');
$loginInfo = json_decode(file_get_contents('php://input'));
$username = $loginInfo->username;
$q = $db->prepare("SELECT * FROM userauth WHERE username=:username");
$q->bindParam(':username', $username, PDO::PARAM_STR);
$q->execute();
$userRow=$q->fetch(PDO::FETCH_ASSOC);
if(password_verify($loginInfo->password , $userRow['password'])){
print 'success';
}else{
print 'error';
}
?>