PHP Conference Japan 2024

传递 Session ID

有两种方法可以传播 session id

  • Cookie
  • URL 参数

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

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

注意:

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

或者,您可以使用常量 SID,如果 session 已启动则定义此常量。如果客户端没有发送相应的 session 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,因为将其泄露到不同的服务器会构成安全风险。

添加注释

用户贡献的注释 2 条注释

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

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

这似乎是默认行为。一种解决方法是打开 session.use_only_cookies,但是这样一来,任何已关闭 Cookie 的用户都会丢失 session 数据。
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