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