我正在使用这个Mysqli php类。
在我阅读了文档并经过各种尝试之后,我已经锁定了这个简单的登录脚本,我正在编写。
如果我尝试使用数据库中不存在的某些登录详细信息登录,则会将我重定向到用户页面。我现在不知道如何解决这个问题,因为如果我尝试使用$db->has()
函数,这个问题也会持续存在。如类文档所示,这个函数应该检查数据库以验证是否存在请求的元素,但是$db->has()
总是给我错误的用户名或密码错误,如果凭据是正确的并且存在于数据库中。
//process login form if submitted
if(isset($_POST['submit'])){
$user = $_POST['username'];
$password = $_POST['password'];
NB:这是检查密码哈希的错误方法。试试print_r($hash);
您会注意到用户密码输入生成的哈希值永远不会与存储在数据库中的哈希值匹配。
// check that the hashed password match and query the db.
$hash = password_hash($password, PASSWORD_BCRYPT);
$db->where("username", $user);
$db->where("password", password_verify($password, $hash));
$db->get('members');
if($db->has('members')){
$success[] = "You are now logged in";
$_SESSION['username'] = $user;
header('refresh:5; url=dashboard.php');
} else {
$error[] = "Wrong username or password";
}
修改
我做了一个测试页面,似乎工作正常。正如评论中所建议的,我首先查询数据库以验证用户名是否存在,然后在执行查询后,我创建了两个变量来检查密码和用户名是否正确。
if(isset($_POST['test'])){
$cols = Array ("username","password");
$db->where('username', $_POST['username']);
//execute the query
$results = $db->get("members", null, $cols);
// fetch the results and verify credentials for the login
if(!empty($results)){
foreach($results as $results){
$username = $results['username'];
$hashPwd = $results['password'];
}
$verifyPwd = password_verify($_POST['password'], $hashPwd);
if($_POST['username'] == $username and $verifyPwd == TRUE){
echo 'success';
#this print is used inly to verify if the query work print_r($results);
}
}else {
#this print is only to verify if the query work print_r($results);
echo 'error';
}
}
NB: 正如评论中所报道的那样,我在编辑中发布的第一版工作代码可能容易受到SQL注入攻击。
我添加了一些安全功能,使脚本更安全,请参阅下面的代码。我们将不胜感激每一项提高安全性的建议。
<?php
session_start();
ob_start();
require('includes/MysqliDb.php');
$db = new MysqliDb ('localhost', 'root', 'root', 'my_recordz');
//process login form if submitted
if(isset($_POST['submit'])){
//sanitize user input
$query = filter_var($_POST['username'], FILTER_SANITIZE_SPECIAL_CHARS);
filter_var($query, FILTER_SANITIZE_EMAIL);
$fields = array('username', 'password');
foreach($fields as $fieldname){
if(!isset($_POST[$fieldname]) || empty($_POST[$fieldname])) {
$error[] = 'Empty '.$fieldname.'<br/>';
}
}
if(!$error) {
$cols = Array ("email","username","password");
$db->escape($query);
NB: $db->escape()
函数是mysqli_real_escape_string()
的类包装器。我已经使用$db->where()
和$db->orWhere()
来检查数据库中的用户名或电子邮件,这样用户就可以同时使用这两种方法进行登录。如果您仅使用$db->where()
,则无效。
$db->where('username', $query);
$db->orWhere('email', $query);
$results = $db->get("members", null, $cols);
if(!empty($results)){
foreach($results as $results){
$username = $results['username'];
$usermail = $results['email'];
$hashPwd = $results['password'];
}
NB:这是我检查密码的方法,正确的方法。从结果数组我已经将$hashPwd
变量分配给存储在数据库中的散列密码,然后我使用password_verify()
来匹配散列并检查插入的密码是否正确。登录范围不需要password_hash()
。
$verifyPwd = password_verify($_POST['password'], $hashPwd);
if($query == $username and $verifyPwd == TRUE){
$success[] = 'Login Success';
print_r($results);
}
elseif($query == $usermail and $verifyPwd == TRUE){
$success[] = 'Login Success';
print_r($results);
}else {
$error[] = 'Wrong username or email address';
print_r($results);
}
}else {
$error[] = 'Wrong username and/or password';
print_r($results);
}
}
}
ob_end_flush();
//include header template
require('layout/header.php');
?>
答案 0 :(得分:0)
使用此
//process login form if submitted
if(isset($_POST['submit'])){
$user = $_POST['username'];
$password = $_POST['password'];
//check that the hashed password match
$hash = password_hash($password, PASSWORD_BCRYPT);
//query the database for result
$db->where("username", $user);
$db->where("password", password_verify($password, $hash));
$getuser = $db->getOne('members');
if(!empty($getuser)) {
$success[] = "You are now logged in";
$_SESSION['username'] =$user['username'];
header('refresh:5; url=dashboard.php'); }
else { $error[] = "Wrong username or password"; }
不要介意我的错字使用我的手机