傳送會話ID

有兩種方式用來傳送會話 ID:

  • Cookies
  • URL 參數(shù)

會話模塊支持這兩種方式。 Cookie 方式相對好一些,但是用戶可能在瀏覽器中關閉 Cookie,所以 第二種方案就是把會話 ID 直接并入到 URL 中,以保證會話 ID 的傳送。

無需開發(fā)人員干預,PHP 就可以自動處理 URL 傳送會話 ID 的場景。 如果啟用了 session.use_trans_sid 選項, PHP 將會自動在相對 URI 中包含會話 ID。

注意:

arg_separator.output php.ini 配置指令允許你自定義會話 ID 參數(shù)分隔符。 可以設定為 & 來保持和 XHTML 的一致性。

會話開始之后,可以使用 SID 常量。 如果客戶端未提供會話 cookie,該常量的展開形式為 session_name=session_id, 反之,該常量為空字符串。因此,可以直接在 URL 中包含此常量的展開字符串而無需考慮會話 ID 的實際傳送方式。

下例演示了如何在會話中注冊變量以及如何使用 SID 常量正確的鏈接到另一頁面。

示例 #1 某單一用戶的點擊數(shù)

<?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 參數(shù)編譯的 PHP, 上例中打印 SID 常量部分就可以省略。

注意:

非相對 URL 將被視為指向外部站點的鏈接, 從安全角度考慮,外站的鏈接 URL 中將 不包含 SID 常量,以避免將 SID 泄露到外部服務器的風險。