【问题标题】:iframe holding previous php session infoiframe 保存以前的 php 会话信息
【发布时间】:2017-10-30 15:47:27
【问题描述】:

我正在开发一个应用程序,其中一个链接打开了一个包含表单的 iframe。预先填充的表单输入取决于登录的用户。这对于第一个登录的人来说很好,但是如果用户注销并让浏览器打开以供另一个用户登录,当导航到该 iframe 时,它​​仍然会根据在原始登录用户上。

在进行 $_SESSION 的 print_r 时,会显示原始用户的所有会话信息。但是,如果我在登录后的登陆页面上打印会话信息,它会显示当前登录用户的正确用户信息。

退出代码:

function LogOut() {
    session_start();

    $sessionvar = $this->GetLoginSessionVar();

    $_SESSION[$sessionvar]=NULL;

    unset($_SESSION[$sessionvar]);

    if(isset($_COOKIE['PHPSESSID'])):
        setcookie('PHPSESSID', '', time()-7000000, '/');
    endif;

    session_destroy();
}

知道这里发生了什么吗?

【问题讨论】:

  • 当用户退出时你会破坏会话吗?
  • 是的,我也试过 $_SESSION = array();

标签: php iframe session-variables


【解决方案1】:

完全实现您的注销行为

如果用户退出并让浏览器保持打开状态... [ iframe $_SESSION ] 显示原始用户的所有会话信息。

这是你的问题。

任何完全实现的注销行为都需要清除浏览器 cookie 和 $_SESSION 数据。

浏览器缓存

最有可能发生的是浏览器正在缓存该 iFrame 中 url 的结果,和/或 cookie 中仍有用户数据。

实现用户会话密钥,或在 iFrame url 中加载令牌。

充分解决此问题以防止将来出现此问题,可能需要以下步骤:

iFrame 网址:

  • 包括会话令牌或随机生成的令牌,作为 iFrame url 的查询字符串参数。加载 iframe 所必需的,并根据 $_SESSION 检查服务器端以确保它与当前登录的用户匹配。
  • 为此 iFrame 设置超时。您的部分问题是,如果用户打开此选项卡,但从另一个选项卡注销,会发生什么情况?在这种情况下,除了实现超时或在 iframe 上实现常规 ajax 检查匹配会话之外,您无能为力。

退出:

  • 清除浏览器 cookie。
  • 清除会话。

关于清除会话

为了完全终止会话,会话 ID 还必须是 未设置。如果使用 cookie 传播会话 ID(默认 行为),则必须删除会话 cookie。 setcookie() 可能是 用于那个。

PHP Session Destroy

调用session_destroy(),或设置$_SESSION = array() 不会删除会话cookie(保留以前用户的会话)。要正确销毁会话,请致电setcookie()

session_start();

// Unset all of the session variables.
$_SESSION = array();

if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

// Finally, destroy the session.
session_destroy();

发件人:PHP session_destroy Example 1

【讨论】:

  • 感谢托尼,我已更新问题以包含注销代码。我相信我们已经在按照您的建议进行操作了。
  • @SteveBrown,仔细看看PHP Session Destroy: Example 1。此外,请仔细映射可能导致 iFrame/Browser 保留 iframe 内容的步骤(和打开选项卡)(我的答案的浏览器缓存部分)。
  • @SteveBrown,一种或另一种方式,如果 iFrame 在第二次登录时重新加载,并在 iFrame 的加载时打印 $_SESSION 数据显示来自前一个用户的数据,$_SESSION没有被正确销毁。
  • 好的,谢谢,我会进一步研究。我还尝试将链接从拉出 iframe 更改为重定向到新页面,但仍然存在同样的问题。
  • @SteveBrown,那么您没有正确销毁会话。请参阅我的答案末尾的调整。
猜你喜欢
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-05
  • 2010-10-15
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多