我们有一个系统,用户登录到管理页面进行编辑,但是当他们登录时,只要用户名正确,他们就可以使用任何密码登录。以下代码在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);
}
?>
有人知道如何制作它所以它只使用正确的用户名和密码登录用户。
密码在我们的数据库中以及用户名中。如果需要更多代码,请说明,我将回复相关部分。
答案 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");
}
?>