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



我目前正在学习php,我试图找出如何显示错误消息,如果用户试图绕过用户名和密码验证。我知道关于这一点有类似的问题和解决方案,但我不确定如何实现这些解决方案到我的代码。

我的代码序列如下:

a.p p -用户登录并在这里进行验证,即如果用户名和密码与数据库中的匹配,则启动会话并重定向并访问b.p p。

b.p p -只能由授权用户访问。如果没有登录,重定向到c.p php。我有下面的b.p php代码:

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

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

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

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

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

  • 显示登录表单
  • 处理登录表单
  • 登录成功时,记录用户已登录某"永久";
  • 检查用户是否登录
    • 如果他们登录了,允许他们访问一些特权内容/功能
    • 如果他们没有登录,显示登录表单,并提供帮助信息

通常,这些只是应用程序中的函数,所以您可以这样写:

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.p p,它基本上什么都不做,然后从那里的到a.p p。您需要传递消息:
header('Location: A.php?messagecode=' . $_GET['messagecode']);
exit;

但是,如果用户乱用url,这又会产生问题…

另一种选择是将消息存储在会话中——目前,c.p p会销毁会话,但没有理由不能为未登录的人保留一个活动会话。你可以这样写:

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

然后在a.p 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']);
}

这将保持消息"prepared"无论你重定向多少次,都不给用户任何机会来乱搞它(除了清除他们的cookie,从而清除他们的会话)。

最新更新