使用哈希验证PHP密码


PHP password verifcation with hash

我们有一个系统,用户登录到管理页面进行编辑,但当他们登录时,只要用户名正确,他们可以使用任何密码登录。以下代码在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);
}
    ?>

有人知道如何让它只使用正确的用户名和密码登录吗。

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

来自文档:

session_destroy()销毁与当前一场它不会取消设置与关联的任何全局变量会话,或取消设置会话cookie。

如果设置了$_SESSION['url'],但密码错误,session_destroy()不会取消设置。因此,您仍然处于If语句的成功部分。

编辑:此外,你应该在需要的实际页面上检查身份验证。在这里,看起来你是在一个页面上检查,然后有条件地重定向到另一个页面。如果我直接在地址栏中键入另一个页面的URL,我会在没有身份验证的情况下获得该页面吗?

在@AlexHowansky上进行Piggybacking回答,您需要在这里做一些事情:

首先,您需要确保在脚本开始时使用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");
}
    ?>