PHP Conference Japan 2024

傳遞 Session ID

有兩種方法可以傳播 session id

  • Cookie
  • URL 參數

Session 模組支援這兩種方法。Cookie 是最佳選擇,但由於並非總是可用,我們也提供了替代方案。第二種方法是將 session id 直接嵌入 URL 中。

PHP 能夠透明地轉換連結。如果啟用執行階段選項 session.use_trans_sid,相對 URI 將會自動修改為包含 session id。

注意事項:

php.ini 指令中的 arg_separator.output 允許自訂參數分隔符號。為了完全符合 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 相關攻擊。

如果在編譯 PHP 時使用了 --enable-trans-sid,則不需要像上面顯示的那樣列印 SID

注意事項:

非相對 URL 會被假設為指向外部網站,因此不會附加 SID,因為將 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 將始終為 ''(空字串)。
但如果指令 `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