【问题标题】:Restrict user from accessing webpage + Incorrect username/password alert限制用户访问网页 + 用户名/密码错误提示
【发布时间】:2019-04-26 05:27:04
【问题描述】:

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

?>

【问题讨论】:

  • 你需要在这里发布你的代码,作为代码而不是图像。
  • 欢迎来到 SO,我建议您在询问之前阅读minimal reproducible example
  • $username == 'username' && $password == 'password' 的补码是 $username != 'username' || $password != '密码
  • @jeroen 抱歉,这是我第一次使用它。刚刚添加了我的代码。
  • 在你的代码中记住你必须把 session_start 放在第一行...

标签: php


【解决方案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']);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多