【问题标题】:passing session id via url通过 url 传递会话 ID
【发布时间】:2009-05-06 03:27:49
【问题描述】:

我正在尝试让我的脚本使用 url 会话 ID 而不是 cookie。 以下页面未将 url 中的变量作为会话 id。 我一定是错过了什么。

首页http://www.website.com/start.php

ini_set("session.use_cookies",0);
ini_set("session.use_trans_sid",1);
session_start();
$session_id = session_id();
header("location: target.php?session_id=". $session_id );

下一页 - http://www.website.com/target.php?session_id=rj3ids98dhpa0mcf3jc89mq1t0

ini_set("session.use_cookies",0);
ini_set("session.use_trans_sid",1);
print_r($_SESSION);
print(session_id())

结果是不同的会话 ID,会话为空白。

数组 ( [debug] => no ) pt1t38347bs6jc9ruv2ecpv7o2

【问题讨论】:

  • 您是否在使用某种 PHP 框架?普通 PHP 不会自动解释查询字符串中的任何内容,因此 $_SESSION 和 $_GET['session_id'] 之间没有隐含的联系。
  • 请记住,将会话 ID 放在 url 中可能意味着它将通过 HTTP 引荐来源网址泄露...
  • 我们有自己的专用 apache 服务器和 php。它不共享。这会带来安全风险吗?
  • 是的。引荐来源网址问题是指从您的服务器到某个外部服务器的链接。当有人点击该链接时,外部服务器将收到他们之前所在的网址 - 包括会话 ID。
  • 如果有人将地址从浏览器复制粘贴到电子邮件中,也可能会泄露。

标签: php url session ini-set


【解决方案1】:

使用 url 传递会话 id 时要小心,这可能会导致通过引用者劫持会话!

【讨论】:

  • 怎么可能
  • @bboni 理论上:浏览器将链接来源页面的 url 添加到标题(“引用者”)。如果会话 ID 是 url 参数,则链接页面现在能够劫持会话。我不知道 php 对此采取了哪些额外的保护措施,但它通常被认为是不安全的。
  • 答案如何?
  • 当我写这篇文章时 - 10 年前 - 规则并没有像现在那样严格执行。你说得对,这不是答案(应该是评论)。那时我没有意识到这一点,也没有人强制执行,所以我们来了。
【解决方案2】:

看来您只需要在第二页上调用session_start()

来自文档:

session_start() 根据通过请求(例如 GET、POST 或 cookie)传递的当前会话 ID 创建会话或恢复当前会话。

编辑:

也就是说,您也可以尝试从查询字符串中手动获取会话 ID。在第二页上,您需要执行以下操作:

ini_set("session.use_cookies",0);
ini_set("session.use_trans_sid",1);
session_id($_GET['session_id']);
print_r($_SESSION);
print(session_id());

请注意,session_id() 函数将设置 id,如果您将 id 作为参数传递给它。

【讨论】:

  • 您在编辑之前的第一个答案最有帮助。 session_id($_GET['session_id']);有所作为。
【解决方案3】:

不要硬编码'PHPSESSID',而是使用这个:

session_id($_GET[session_name()]);

【讨论】:

  • 您仍然需要自己知道会话名称才能将其作为 GET 参数传递,但如果您通过变量动态定义会话名称,这是一个好方法。
【解决方案4】:

我的问题是在 FF 中使用 Flash(因为 Flash 搭载 IE,因此 Flash 对象和 firefox 之间不共享会话)

使用 php 5.3 所有这些答案都指向了事实。我最终发现工作非常简单.. 在查询字符串中传递 id。设置它。然后开始会话。

session_id($_GET['PHPSESSID']);
session_start();

【讨论】:

    【解决方案5】:

    稍微修正一下... 不要忘记检查参数是否存在。 这对我很有效。

    if (isset($_GET['PHPSESSID'])) {
      session_id($_GET['PHPSESSID']);
    }
    session_start();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 2013-08-11
      • 2020-05-10
      • 2014-06-24
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      相关资源
      最近更新 更多