0

我试图在 30 分钟后销毁当前用户会话。它工作正常。问题是

1)当其他用户在新选项卡中打开网页链接时,他们设法访问该页面而无需进行 tru 登录过程。

我试过按照这个教程

http://www.homeandlearn.co.uk/php/php14p3.html

<?PHP

session_start();

if (!(isset($_SESSION['login']) && $_SESSION['login'] != '')) {
header ("Location: login.php");
}

?>

但它不工作。因为旧会话尚未被销毁(不到 30 分钟)..

我应该怎么办??

4

1 回答 1

2

通常,用户的登录会话存储在每个网站的单个 cookie 中,该 cookie 在单个浏览器的所有窗口和选项卡中共享。清除浏览器中的 cookie 将需要您再次登录,因为当您下次访问远程网站(您的 PHP 站点)时,您将不再使用旧会话 id 传递 cookie。

当两个人使用相同的浏览器时,这会给您带来问题,因为您网站的 cookie 对两个人来说都是相同的。

您的一个选择是在您的 PHP 站点上提供一个手动“注销”按钮,这将在 30 分钟超时发生之前破坏会话。但是,不能保证用户在完成后会单击此按钮。

来自会话 id 传递的 PHP 文档:

传播会话 id 有两种方法:

  • 饼干

  • 网址参数

session 模块支持这两种方法。Cookie 是最佳选择,但由于它们并不总是可用,我们还提供了另一种方式。第二种方法将会话 ID 直接嵌入到 URL 中。

这表明还有另一个选项可供您启用运行时选项session.use_trans_sid,并且会话 ID 嵌入在每个 url 中,而不是存储在 cookie 中。有了这个,你会得到类似于mysession=123以下网址末尾的值:www.example.com/home.php?mysession=123

因此,如果用户 1 访问 www.example.com 并执行登录mysession=123,那么只要他们的会话处于活动状态,每个链接都会在其末尾出现。

然后用户 2 在新选项卡中浏览到 www.example.com 并要求他们再次登录,因为mysession=###他们输入的 url 中没有值。在此选项卡上登录后,每个链接都会有一个新的 mysession 值,例如www.example.com/home.php?mysession=345

警告:大多数网站更喜欢使用 cookie 是有原因的,您可以在这篇关于PHP 文档中的use-trans-sid 设置的说明中看到。

与基于 cookie 的会话管理相比,基于 URL 的会话管理具有额外的安全风险。例如,用户可以通过电子邮件将包含活动会话 ID 的 URL 发送给他们的朋友,或者用户可以将包含会话 ID 的 URL 保存到他们的书签并始终使用相同的会话 ID 访问您的站点。

于 2012-05-16T03:03:17.130 回答