如何在URL中发送PHPSESSID?

8
我正在尝试通过HTTP GET变量发送PHPSESSID以供无cookie客户端使用。
我在各种Drupal实现中看到过这种情况,每个链接后面都会附加?PHPSESSIONID=123ABC,但我该如何在PHP中指定它,并且是否有任何方法可以更改GET参数,使其变成?token=123ABC,甚至通过HTTP POST发送?
标准LAMP堆栈,运行Zend框架。
谢谢!

不应该将会话ID放在GET变量中,这是一种安全风险。没有任何支持cookie的相关浏览器。 - stefanw
3
stefanw - 正如所述,它是专门为无cookie客户端设计的。 - Sledge
4个回答

10

使用cookie或不使用由以下PHP选项配置:

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


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

但请注意,启用此选项后,对于站点的每个用户,PHP将至少通过GET传递一次会话ID...因为他们起初没有cookie,检查他们是否支持cookie的唯一方法是设置一个cookie,在下一页尝试读取它。
而不支持cookie的用户,包括搜索引擎,也将拥有该会话ID,这并不好:-(


此外,您还可以查看session.name以设置键的名称(将其设置为“token”而不是“PHPSESSID”)


有关更多详细信息,可以查看手册的会话处理部分 :-)


2
手动操作:
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>");

2
您可以使用session_name()或在您的php.ini文件中使用session.name来更改PHPSESSID(或使用ini_set())。
对于无cookie客户端,有session.use_trans_sid php.ini选项-您应该注意,这可能会导致问题-例如用户将带有会话ID的URL传递给彼此,或搜索引擎拾取这些URL。

0
  1. 创建一个登录页面,用户必须输入正确的ID和密码才能登录。
  2. 登录后,用户进入主页,在此用户可以注销并返回登录页面。
  3. 用户必须通过登录页面才能访问主页。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接