## 传送会话ID

有两种方式用来传送会话 ID：

- Cookies
- URL 参数

会话模块支持这两种方式。 Cookie 方式相对好一些，但是用户可能在浏览器中关闭 Cookie，所以 第二种方案就是把会话 ID 直接并入到 URL 中，以保证会话 ID 的传送。

无需开发人员干预，PHP 就可以自动处理 URL 传送会话 ID 的场景。 如果启用了 `session.use_trans_sid` 选项， PHP 将会自动在相对 URI 中包含会话 ID。

> 注意:

> arg_separator.output php.ini 配置指令允许你自定义会话 ID 参数分隔符。 可以设定为 & 来保持和 XHTML 的一致性。

会话开始之后，可以使用 `SID` 常量。 如果客户端未提供会话 cookie，该常量的展开形式为 `session_name=session_id`， 反之，该常量为空字符串。因此，可以直接在 URL 中包含此常量的展开字符串而无需考虑会话 ID 的实际传送方式。

下例演示了如何在会话中注册变量以及如何使用 `SID` 常量正确的链接到另一页面。

示例 #1 某单一用户的点击数

`<?php
session_start();
if (empty($_SESSION['count'])) {
$_SESSION['count'] = 1;
} else {
$_SESSION['count']++;
}
?>
<p>
Hello visitor, you have seen this page <?php echo $_SESSION['count']; ?> times.
</p>
<p>
To continue, <a href="nextpage.php?<?php echo htmlspecialchars(SID); ?>">click
here</a>.
</p>`

可以使用 htmlspecialchars() 来打印 `SID` 常量的展开字符串以避免 XSS 相关的攻击。

如果使用 --enable-trans-sid 参数编译的 PHP， 上例中打印 `SID` 常量部分就可以省略。

> 注意:

> 非相对 URL 将被视为指向外部站点的链接， 从安全角度考虑，外站的链接 URL 中将 不包含 `SID` 常量，以避免将 `SID` 泄露到外部服务器的风险。

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open