带有哈希的PHP密码验证

时间:2016-04-05 16:44:00

标签: php

我们有一个系统,用户登录到管理页面进行编辑,但是当他们登录时,只要用户名正确,他们就可以使用任何密码登录。以下代码在php标签

include 'database_conn.php';

$sql = "SELECT passwordHash FROM nmc_users WHERE username = ?";
$stmt = mysqli_prepare($conn, $sql); // prepare the sql statement


mysqli_stmt_bind_param($stmt, "s", $username);
mysqli_stmt_execute($stmt); // execute the query



mysqli_stmt_bind_result($stmt, $passWDHash);



if (mysqli_stmt_fetch($stmt)) {
    if (password_verify($passWD, $passWDHash)) {
        echo "<p>Password correct!</p><a href='logout.php'>Click here to log off</a></p>\n";
    } else {

        echo "<p>Sorry we don't seem to have that username.</p>";
            session_destroy();
    }

    if (isset($_SESSION['[url']))
        $url = $_SESSION['url'];
    else
        $url = 'index.php';
    header("location $url");

    mysqli_stmt_close($stmt);
    mysqli_close($conn);
}
    ?>

有人知道如何制作它所以它只使用正确的用户名和密码登录用户。

密码在我们的数据库中以及用户名中。如果需要更多代码,请说明,我将回复相关部分。

2 个答案:

答案 0 :(得分:0)

来自文档:

  

session_destroy()会销毁与当前关联的所有数据   会话。它不会取消任何与之相关的全局变量   会话,或取消设置会话cookie。

如果设置了$_SESSION['url'],并且密码错误,则session_destroy()不会取消设置。所以你仍然会陷入if语句的成功部分。

编辑:此外,您应该在需要它的实际页面上检查身份验证。在这里,看起来您正在检查一个页面,然后有条件地重定向到另一个页面。如果我直接在我的地址栏中输入其他页面的URL,我是否会在未经过身份验证的情况下获取该页面?

答案 1 :(得分:0)

在@AlexHowansky上回答,你需要在这里做一些事情:

首先,您需要确保在脚本开头使用session_start()以确保会话设置正确。

其次,您需要取消设置$_SESSION变量,以确保一旦会话被销毁,您就无法在当前页面上识别这些变量(它们将在下一页中取消设置,因此您不必担心这个。)

第三,你需要在重定向之前关闭mysql连接才能使它们发挥作用。

第四,有一个错字:if (isset($_SESSION['[url']))

您的header()重定向也不起作用,因为您在它之前回显文本,这会导致它失败,但我会让您解决这个问题。

我也没有看到$passWD来自哪里,但我假设你已经把它放在那里。

更新的代码:

include 'database_conn.php';

session_start();

$sql = "SELECT passwordHash FROM nmc_users WHERE username = ?";
$stmt = mysqli_prepare($conn, $sql); // prepare the sql statement


mysqli_stmt_bind_param($stmt, "s", $username);
mysqli_stmt_execute($stmt); // execute the query



mysqli_stmt_bind_result($stmt, $passWDHash);



if (mysqli_stmt_fetch($stmt)) {
    if (password_verify($passWD, $passWDHash)) {
        echo "<p>Password correct!</p><a href='logout.php'>Click here to log off</a></p>\n";
    } else {

        echo "<p>Sorry we don't seem to have that username.</p>";
        session_destroy();
        $_SESSION = array();
    }

    if (isset($_SESSION['url']))
        $url = $_SESSION['url'];
    else
        $url = 'index.php';

    mysqli_stmt_close($stmt);
    mysqli_close($conn);

    header("location $url");

}
    ?>