为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Core PHP 中(在每个页面上)验证用户会话并限制用户重新加载页面或返回

如何在 Core PHP 中(在每个页面上)验证用户会话并限制用户重新加载页面或返回

PHP
长风秋雁 2021-06-09 13:14:07
我在核心 PHP 中创建了一个带有登录和注销功能的页面。当我登录时,系统启动一个会话并将我带到一个新页面,其中在 URL 中传递了一个唯一键,它只是该特定用户的主键。但是,当此密钥更改时,用户帐户也很容易更改,无需任何身份验证。例如:如果用户A使用自己的凭据登录系统,则他成功登录。假设他的主键是2。因此,他被带到以下网址:www.example.com/dashboard.php?id=2现在,让我们说,有一个与主键4用户B,如果用户A手动更改密钥的URLwww.example.com/dashboard.php?id=2来www.example.com/dashboard.php?id=4,会话更改用户B.因此,真实性未保持。系统应该就像手动更改URL中的键,或强制重新加载页面或按下后退按钮,则需要销毁会话。
查看完整描述

3 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞


当用户成功通过身份验证时,在 $_SESSION 中定义一个值,类似于


$_SESSION['authenticated'] = true;

然后,对于每个操作,检查该值是否已定义,如果未定义,则将用户重定向到登录页面:


if (isset($_SESSION['authenticated']) &&  $_SESSION['authenticated']) {

  // do some stuff

} else {

  // redirect to the login page

}

通常,在 $_SESSION 中您将存储用户 ID,但由于您希望能够使用 $_GET 值在用户之间切换,您可以只存储一个布尔值,以了解用户是否已通过身份验证。


另一方面(禁用后退按钮)有点困难,这样做不是最佳实践。我可以考虑两种方法:


对整个页面使用 iframe。所有导航都将在 iframe 内完成,后退按钮将返回到您之前的上一个脚本;

使用 AJAX 完成所有操作。不会对整个页面进行重新加载,只对代码片段进行重新加载;

当然,有很多解决方法可以做到这一点,或多或少取决于脚本逻辑。


查看完整回答
反对 回复 2021-06-25
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

首先,您需要在会话中使用一些标识符来告诉您登录的是哪个用户 - 通常这将是用户 ID(在您的情况下是主键)。我将假设是这种情况,并且您已按照如下所示的方式设置它,$row['userID']验证后数据库的结果在哪里。


session_start();

$_SESSION['userID'] = $row['userID'];

让我们以 using 为例?id=4,您可以使用$_GET['id']. 然后你需要做的就是比较两者,看看你的dashboard.php.


session_start();


if (!isset($_SESSION['userID'])) {

    // User is not logged in at all, send 401 header (or you can do something entirely else)

    header("HTTP/1.1 401 Unauthorized");

    exit;

} elseif ($_SESSION['userID'] != $_GET['id']) {

    // User entered someone else's dashboard - redirect to his own dashboard

    header("Location: ?id=".$_SESSION['userID']);

    exit;

}

// If we're past these statements, the user is logged in and accessing his own dashboard

但是,您可能可以删除该?id=4部分,而只是使用$_SESSION['userID'](或您定义的任何内容)来获取用户数据,从而在您访问/dashboard.




查看完整回答
反对 回复 2021-06-25
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

您需要在登录页面的身份验证步骤中更新 php


if(email verified && password correctly entered){

    // add user related info to session

    $_SESSION['userInfo'] = ['id' => 2, 'name' => 'Anunay']; //info can be retried from db

    session_start();

    //add redirect code to home.php or dashboard

}

在所有文件中,您需要添加的页面顶部 session_start()


现在您可以添加签入标题部分


if(isset($_SESSION) && !empty($_SESSION)){

    //get id from session

    //get name from session 

    //you can add text welcome Anunay etc

}


查看完整回答
反对 回复 2021-06-25
  • 3 回答
  • 0 关注
  • 176 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号