繁体   English   中英

如果用户试图绕过 PHP 中的登录过程,如何传递错误消息?

[英]How to pass an error message if a user tries to bypass the login process in PHP?

我目前正在学习 php,并且我试图弄清楚如果用户试图绕过用户名和密码验证,如何显示错误消息。 我知道对此有类似的问题和解决方案,但我不确定如何在我的代码中实施这些解决方案。

我的代码顺序如下:

A.php - 用户登录并在此处进行验证,即如果用户名和密码与数据库匹配,则启动会话并重定向并授予对 B.php 的访问权限。

B.php - 只能由授权用户访问。 如果未登录,则重定向到 C.php。 我有以下 B.php 代码。

<?php
session_start();
if (!$_SESSION["who"]) {   //checks if user is logged in
  header("location: C.php");
} else {
//other code goes here
}
?>

C.php - 此页面破坏会话并重定向回登录页面,在本例中为 A.php。 我有以下 C.php 代码。

<?php
session_start();
session_destroy();
header("location: A.php");
?>

我想弄清楚的是,如果用户直接访问 B.php 而不经过 A.php 的过程,我如何向用户显示错误消息。 我希望你能帮助我解决这个问题,谢谢。

让我们分解您的代码需要做什么,而不对如何做做任何假设:

  • 显示登录表单
  • 处理登录表单
  • 成功登录后,记录用户以某种“永久”方式登录
  • 检查用户是否登录
    • 如果他们已登录,允许他们访问某些特权内容/功能
    • 如果他们没有登录,请显示登录表单,并提供有用的消息

通常,这些只是应用程序中的函数,因此您可以编写如下内容:

if ( ! is_user_logged_in() ) {
    echo "<p>You must log in to view this page</p>";
    display_login_form();
    exit;
}

您可能希望将消息合并到登录表单的布局中,因此将其作为参数传递:

if ( ! is_user_logged_in() ) {
    display_login_form("You must log in to view this page");
    exit;
}

在您的代码中,您已将大部分函数放入它们自己的文件中,因此您必须反复重定向用户的浏览器,而不是仅仅调用函数。

这意味着我们必须将传递给display_login_form的参数替换为其他获取数据的方式。 一种简单的方法是查询字符串参数:

header('Location: A.php?message=You%20must%20log%20in%20to%20view%20this%20page');
exit; // important that no code runs after we've set up the redirect!

在查询字符串中包含实际文本有点尴尬,因为用户可以对其进行编辑,并相互欺骗进入带有奇怪消息的 URL,甚至可能存在安全风险 每个可能的消息都有一个代码会更好:

header('Location: A.php?messagecode=page_requires_login');
exit; // important that no code runs after we've set up the redirect!

您遇到的另一个问题是(由于我不完全清楚的原因),您重定向了两次,第一次重定向到页面 C.php,它基本上什么都不做,然后从那里重定向到 A.php。 您需要传递消息:

header('Location: A.php?messagecode=' . $_GET['messagecode']);
exit;

但是,这又会引发用户在弄乱 URL 时可以做什么的问题……

另一种选择是将消息存储在会话中 - 目前,C.php 会破坏会话,但没有理由不能为未登录的人建立活动会话。所以你可以这样写:

$_SESSION['login_form_message'] = 'You must log in to view this page';

然后在 A.php 的某个地方,这个:

if ( isset($_SESSION['login_form_message']) ) {
    echo '<p>', $_SESSION['login_form_message'], '</p>';
    // Don't show the message again next time the page loads
    unset($_SESSION['login_form_message']);
}

无论您重定向多少次,这都会使消息保持“准备就绪”,并且不会让用户有任何机会弄乱它(除了清除他们的 cookie,从而清除他们的会话)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM