我正在使用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>;
}
?>
答案 0 :(得分:1)
您不应该这样验证登录名,但是如果您想了解问题所在, 检查这一行:
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)
在登录页面中显示正确的消息
如果要显示给用户,需要登录才能查看页面内容,可以在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']);
}