传递会话 ID

有两种方法可以传播会话 ID

  • Cookie
  • URL 参数

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

PHP 能够透明地转换链接。如果启用了运行时选项 session.use_trans_sid,则相对 URI 将自动更改为包含会话 ID。

注意:

arg_separator.output php.ini 指令允许自定义参数分隔符。为了完全符合 XHTML,请在那里指定 &。

或者,您可以使用常量 SID,该常量在会话启动时定义。如果客户端没有发送适当的会话 cookie,它将采用 session_name=session_id 的形式。否则,它将扩展为一个空字符串。因此,您可以无条件地将其嵌入到 URL 中。

以下示例演示了如何注册变量,以及如何使用 SID 正确链接到另一个页面。

示例 #1 统计单个用户的访问次数

<?php

session_start
();

if (empty(
$_SESSION['count'])) {
$_SESSION['count'] = 1;
} else {
$_SESSION['count']++;
}
?>

<p>
您好,访问者,您已经访问了此页面 <?php echo $_SESSION['count']; ?> 次。
</p>

<p>
要继续,请 <a href="nextpage.php?<?php echo htmlspecialchars(SID); ?>">点击
这里</a>。
</p>

在打印 SID 时,可以使用 htmlspecialchars() 来防止与 XSS 相关的攻击。

如果使用 --enable-trans-sid 编译 PHP,则不需要像上面那样打印 SID

注意:

非相对 URL 被假定为指向外部站点,因此不会附加 SID,因为将 SID 泄漏到不同的服务器将是一个安全风险。

添加注释

用户贡献的注释 2 个注释

匿名
14 年前
第一次访问页面时,PHP 还没有知道浏览器是否接受 Cookie,因此在调用 session_start() 后,SID 将不为空,并且 PHPSESSID 将插入到该页面上所有正确使用 SID 的链接 URL 中。

这将导致,例如,如果搜索引擎机器人首先访问您的主页,则它在您的主页上看到的所以链接都将带有难看的 PHPSESSID=...。

这似乎是默认行为。一个解决方法是开启 session.use_only_cookies,但是这样您就会丢失任何关闭 Cookie 的用户的所有会话数据。
EastWhite at foxmail dot com
8 年前
如果 php ini 文件中的指令 session.use_trans_sid 设置为 0,则常量 SID 将始终为 ''(空字符串)。
但是,如果 director session.use_only_cookies 为 1,则将 session.use_trans_sid 设置为 1 不会生效。
尝试
session_start(['use_only_cookies'=>0])
或者
session_start(['use_only_cookies'=>0,use_trans_sid=1])
To Top