【问题标题】:How can I send PHPSESSID in the URL?如何在 URL 中发送 PHPSESSID?
【发布时间】:2017-02-07 17:15:42
【问题描述】:

我正在尝试通过 HTTP GET 变量为无 cookie 的客户端发送 PHPSESSID。

我在各种drupal 实现中看到了这一点,其中?PHPSESSIONID=123ABC 附加到每个链接,但我如何在PHP 中指定它,有没有办法改变GET 参数,所以它可以是?token=123ABC,或者甚至通过 HTTP POST 发送?

标准 LAMP 堆栈,运行 Zend 框架。

谢谢!

【问题讨论】:

  • 您不应该将会话 ID 放在 GET 变量中,这是一个安全风险。没有不支持cookies的相关浏览器。
  • stefanw - 如前所述,它专门用于无 cookie 客户端。

标签: php url session


【解决方案1】:

是否使用 cookie 由这些 PHP 选项配置:

如果设置了第一个,则尽可能使用 cookie。
PHP 应该检测 cookie 是否启用,并且只有在客户端支持时才使用它们。


要启用通过 GET 而不是 cookie 传递会话 id,您可能必须激活 session.use_trans_sid,默认情况下禁用 (这意味着,默认情况下,会话 id 仅由 cookie 传递 - 从不通过 GET ).

但请注意,激活此选项后,PHP 将通过 GET 至少为您网站的每个用户将访问的第一页传递会话 id...因为他们一开始没有 cookie,并且检查它们是否支持 cookie 的唯一方法是设置一个,并尝试在下一页上读回它。
而且不支持 cookie 的用户(包括我可能会说的搜索引擎)将拥有该会话 id——这并不好 :-(


而且,您可能还想看看session.name 来设置键的名称​​(我的意思是设置为“token”而不是“PHPSESSID”)


有关更多详细信息,您可以查看手册的Session Handling 部分:-)

【讨论】:

    【解决方案2】:

    您可以在 php.ini 文件中使用 session_name()session.name 更改 PHPSESSID(或使用 ini_set())。

    对于无 cookie 客户端,有 session.use_trans_sid php.ini 选项 - 您应该知道这可能会导致问题 - 例如,用户将带有会话 ID 的 URL 传递给彼此,或搜索引擎拾取此类 URL。

    【讨论】:

      【解决方案3】:

      手动操作:

      if ($_REQUEST['token'])
        session_id($_REQUEST['token']);
      session_start();
      
      print("foo=".$_SESSION['foo']++."<br />".
            "<a href={$PHP_SELF}?token=".session_id().">link</a><br />");
      print("<form method=POST>".
            "<input type=hidden name=token value=".session_id()." />".
            "<input type=submit /></form>");
      

      【讨论】:

        【解决方案4】:
        1. 创建一个登录页面,用户必须没有正确的id和密码才能登录。
        2. 登录后用户回到首页,在这里用户可以注销并返回登录页面。
        3. 用户必须通过登录页面才能访问主页。

        【讨论】:

          猜你喜欢
          • 2012-08-19
          • 2013-06-07
          • 1970-01-01
          • 1970-01-01
          • 2011-02-16
          • 2013-12-07
          • 1970-01-01
          • 2014-08-11
          • 2013-08-10
          相关资源
          最近更新 更多