密码系统不做任何事情

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() 不做任何事情。

WebSocketSession.send 不做任何事情

TabControl.VerticalAlignment = 拉伸不做任何事情

npm update 不做任何事情

下拉框更改时提交表单 - 不做任何事情