密码系统不做任何事情
Posted
技术标签:
【中文标题】密码系统不做任何事情【英文标题】:Password System Not Doing Anything 【发布时间】:2016-02-16 09:01:09 【问题描述】:下面的代码是一个登录系统。用户名是管理员,密码是密码(您可以稍后更改)它现在所做的是在发送表单后它只显示登录页面。我找不到任何问题。请帮忙。 error_log 文件不显示任何内容。可能是密码没有正确散列。当我使用
设置密码时echo password_hash("password", PASSWORD_DEFAULT);
然后只插入结果。
<?php
session_start();
$message="";
require 'settings.php';
if(count($_POST)>0)
$username = mysqli_real_escape_string($_POST['user_name']);
$password = mysqli_real_escape_string($_POST['password']);
$result = mysqli_query("SELECT * FROM members WHERE username='" . $username . "'");
$row = mysqli_fetch_array($result);
if(is_array($row))
$hash = $row['password'];
$passwordcheck = password_verify($password, $hash);
if($hash == $passwordcheck)
$_SESSION["user_id"] = $row['id'];
$_SESSION["user_name"] = $row['username'];
else
$message = "Invalid Username or Password!";
if(isset($_SESSION["user_id"]))
mysqli_query("DELETE * FROM LoginAttempts WHERE IP='".$ip."'");
header("Location:dashboard.php");
?>
<div class="panel-body">
<form name="frmUser" method="post" action="">
<fieldset>
<div class="form-group">
<input class="form-control" placeholder="Username" name="user_name" type="username" autofocus>
</div>
<div class="form-group">
<input class="form-control" placeholder="Password" name="password" type="password" value="">
</div>
<input type="submit" name="submit" value="Submit" class="btn btn-success btn-lg btn-block">
</fieldset>
</form>
<?php
if($locked == 'yes')
echo "Sorry you are locked out of the system. Please try again in";
echo $timeleft;
?>
</div>
编辑:现在我收到这些错误: [2015 年 11 月 15 日 07:00:58 Europe/Moscow] PHP 警告:mysqli_connect(): (28000/1045): /home 中的用户 'laughin1'@'176.31.10.37' 的访问被拒绝(使用密码:否) /laughin1/public_html/admin/index.php 在第 9 行 [15-Nov-2015 07:00:58 Europe/Moscow] PHP 警告:mysqli_select_db() 需要 2 个参数,1 个在 /home/laughin1/public_html/admin/index.php 第 10 行给出 [15-Nov-2015 07:00:58 Europe/Moscow] PHP 警告:mysqli_real_escape_string() 需要 2 个参数,1 个在 /home/laughin1/public_html/admin/index.php 第 11 行给出 [15-Nov-2015 07:00:58 Europe/Moscow] PHP 警告:mysqli_real_escape_string() 需要 2 个参数,1 个在 /home/laughin1/public_html/admin/index.php 第 12 行给出 [15-Nov-2015 07:00:58 Europe/Moscow] PHP 警告:mysqli_query() 期望参数 1 为 mysqli,布尔值在 /home/laughin1/public_html/admin/index.php 第 14 行给出 [15-Nov-2015 07:00:58 Europe/Moscow] PHP 警告:mysqli_fetch_array() 期望参数 1 为 mysqli_result,在第 15 行的 /home/laughin1/public_html/admin/index.php 中给出 null
但是如果我将 MySQLi 更改为 MySQL,一切都很好。
【问题讨论】:
试试var_dump
你的$row
,它显示了什么?另外,在header
之后,最好加上exit()
是的。散列显然有问题,因为如果我对密码进行散列处理,它就可以工作。
你使用password_verify
来验证密码,你不会再次对登录密码进行哈希处理,因为它会生成一个全新的密码,这就是它不匹配的原因
@andrew 谢谢。但是,如果密码存储在我之前散列的密码中,我如何使用散列检查密码。
【参考方案1】:
用户注册时,您将使用password_hash
对其密码进行哈希处理并存储在数据库中,当用户尝试登录时,您将使用password_verify
验证其密码
程序:
register->password_hash()->save_in_db()
login->fetch_hash_column_from_their_username->password_verify()
if verified->set_session->redirect, else stay_in_the_same_page
为您的表单添加一些验证,这样用户就不会经常访问您的数据库,这会产生高负载并(稍微)阻止对您的网站的一些保护
还有,在这一行之后
header("Location:dashboard.php");
添加
exit();
有关原因的更多信息,请单击此处Why I have to call 'exit' after redirection through header('Location..') in PHP?
更新:
password_verify
接受两个参数( string $password , string $hash )
,您将把登录密码作为第一个参数,并将从您的数据库中存储的哈希值放入第二个参数。如果匹配则为return true
,否则为return false
【讨论】:
这是否意味着我必须编写两个查询。 1. 使用唯一用户获取哈希(这将是 row['password'];)然后使用现在收集的哈希进行验证,然后使用数据库中的密码检查现在验证的密码? @安德鲁 只有一个查询,从表单的用户名中获取哈希,比如SELECT hash FROM user_table WHERE username = x
,然后你可以使用password_verify
验证密码
我看到一个错误..应该是if ($passwordcheck === true)
为什么 3 === ?也感谢您的帮助,这是非常需要的。
@user3579312 ==
比较排除类型,===
比较类型...也可以写成if ($passwordcheck)
,来自文档:php.net/manual/en/language.operators.comparison.php【参考方案2】:
添加到 Andrew 的 password_verify 评论
$encryptPassword = password_hash($users-signup-password, PASSWORD_BCRYPT);
$encryptedPassord 中的值存储在数据库中(通常),即:用户注册成功时。
在登录时获取用户的哈希,典型的选择将在电子邮件上假设 这是用户的唯一标识符
$hash = findUserByEmail($email); // 虚拟函数,你实现这个
$isAuth = password_verify($users-login-password, $hash);
见http://php.net/manual/en/function.password-verify.php
提示:如果 $isAuth 为真,那么您应该在数据库中存储密码的新哈希值,最好为每个密码设置动态哈希值。
【讨论】:
只有一个用户。这是一个管理面板。 exit 阻止页面的其余部分执行...标题只是重定向。以上是关于密码系统不做任何事情的主要内容,如果未能解决你的问题,请参考以下文章
ListView onItemClickListener 不做任何事情
OpenCV destroyWindow() 不做任何事情。