猿问

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

我在核心 PHP 中创建了一个带有登录和注销功能的页面。当我登录时,系统启动一个会话并将我带到一个新页面,其中在 URL 中传递了一个唯一键,它只是该特定用户的主键。但是,当此密钥更改时,用户帐户也很容易更改,无需任何身份验证。

例如:如果用户A使用自己的凭据登录系统,则他成功登录。假设他的主键是2。

因此,他被带到以下网址:www.example.com/dashboard.php?id=2现在,让我们说,有一个与主键4用户B,如果用户A手动更改密钥的URLwww.example.com/dashboard.php?id=2www.example.com/dashboard.php?id=4,会话更改用户B.因此,真实性未保持。

系统应该就像手动更改URL中的键,或强制重新加载页面或按下后退按钮,则需要销毁会话。


长风秋雁
浏览 177回答 3
3回答

米琪卡哇伊

当用户成功通过身份验证时,在 $_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 完成所有操作。不会对整个页面进行重新加载,只对代码片段进行重新加载;当然,有很多解决方法可以做到这一点,或多或少取决于脚本逻辑。

一只斗牛犬

首先,您需要在会话中使用一些标识符来告诉您登录的是哪个用户 - 通常这将是用户 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.

慕虎7371278

您需要在登录页面的身份验证步骤中更新 phpif(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}
随时随地看视频慕课网APP
我要回答