我使用的是php,但没有数据库。
当我使用错误的用户名/密码登录时,它会显示"用户名/密码不正确",这是正确的。
但是,当我在未登录的情况下访问其他网页时,它还会显示"用户名/密码不正确",而不是"您必须登录才能访问此页面"。
<?php
$username = "admin";
$password = "its30305";
session_start();
if(isset($_SESSION['username])){
echo "<h1>Welcome ".$_SESSION['username]."</h1>";
}
else{
if($_POST['username] == $username && $_POST['password'] == $password){
$_SESSION['username] = $username;
echo "<script>location.href='mainmenu.php'</script>;
}
elif($_POST['username] != $username || $_POST['password'] != $password){
echo "<script>alert('Username/Password incorrect!')</script>";
echo "<script>location.href='login.php'</script>;
}
elif(!isset($_SESSION['access]){
echo "<script>alert('You must log in to access this page')</script>";
echo "<script>location.href='login.php'</script>;
}
?>
您不应该这样验证登录,但如果您想了解问题,检查这一行:
else if(!isset($_SESSION['access']){
在$_POST之前检查$_SESSION['access'],你就不会再有这个问题了:
if(!isset($_SESSION['access']){
//Need login to access this page
}else if($_POST['username'] == $username && $_POST['password'] == $password){
//Wrong username or password
}else if ...
我强烈建议更改您的代码结构:
使用PHP转发而不是JavaScript转发
如果您想在用户没有登录页面的权限时转发到登录页面,请使用header
,如下所示:
header('location: /login.php');
die();
使用die()
或exit()
转发后,始终终止当前脚本。
在使用$_POST密钥前检查是否已设置
确保$_POST在之前设置,例如:
isset($_POST['username']) && $_POST['username'] == $username
不要在代码中存储原始密码
始终存储哈希密码,无论您是否使用数据库。如果你想知道你的密码哈希是什么,你可以用找到它
password_hash("its30305", PASSWORD_DEFAULT);
你可以在你的代码中使用它:
$username = 'admin';
$password = '$2y$10$ZSCf.Nlma2mBrKetjqnEB.sdWcBiGJoByhPxwo9wCW8Nvz5Zc7Omm'; //Result of password_hash("its30305", PASSWORD_DEFAULT);
阅读password_hash
使用password_verify验证您的密码
您可以使用password_verify验证密码,如下所示:
isset($_POST['password']) && password_verify($_POST['password'],$password)
阅读password_verify。
在登录页面中显示正确的消息
如果你想向用户显示,你需要登录才能看到页面内容,你可以在header()
之前设置一个$_SESSION['login_message'],并在登录页面中检查该会话。如果设置了,则在登录页面上显示正确的消息,然后取消设置会话。例如:
$_SESSION['login_message'] = 1; //user need to login to see the content
header('location: /login.php');
die();
在login.php上:
if (isset($_SESSION['login_message'])){
switch ($_SESSION['login_message']){
case 1:
echo 'Need to login to see the page.';
break;
case 2:
echo 'Wrong username or password.';
break;
}
//saw the message, not need it anymore!
unset($_SESSION['login_message']);
}