限制用户访问网页+错误的用户名/密码警报

时间:2018-11-23 15:35:04

标签: php

我正在使用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>;
    }

?>

1 个答案:

答案 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)

了解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']);
}