Zend_Session_Namespace 不僅提供 Session 命名空間隔離,還支援以秒為單位的全域過期、以及針對單一鍵的存取次數限制(Hops)。本文演示如何構建「300 秒全域過期、密碼欄位最多讀取 5 次」等精細策略。
<?php
require_once("Zend/Loader.php");
Zend_Loader::loadClass("Zend_Session_Namespace");
$session = new Zend_Session_Namespace('Db'); // 命名空間 'Db'
// 寫入資料
$session->host = '127.0.0.1';
$session->username = 'root';
$session->password = '111';
$session->dbname = 'test';
// 1. 全域過期:300 秒後整個命名空間失效
$session->setExpirationSeconds(300);
// 2. 鍵級 Hop 限制:每個鍵獨立計數,讀取達上限即自動移除該鍵
$session->setExpirationHops(2, 'host'); // host 最多讀 2 次
$session->setExpirationHops(3, 'username'); // username 最多讀 3 次
$session->setExpirationHops(4, 'password'); // password 最多讀 4 次
$session->setExpirationHops(5, 'dbname'); // dbname 最多讀 5 次
| 方法 | 參數 | 行為 |
|---|---|---|
| setExpirationSeconds | $seconds, $vars = null | 全域或指定鍵的秒級過期 |
| setExpirationHops | $hops, $vars = null | 全域或指定鍵的存取次數限制 |
| getExpirationSeconds | $vars = null | 查詢剩餘秒數 |
| getExpirationHops | $vars = null | 查詢剩餘讀取次數 |
$session->key、isset($session->key)、$session->__get())遞增計數器;寫入不計數。unset,後續讀取返回 null。__ZF 內部陣列),跨請求生效。<?php
$sec = new Zend_Session_Namespace('SecureToken');
$sec->token = 'a1b2c3d4e5'; // 一次性驗證碼
$sec->setExpirationHops(1, 'token'); // 只允許讀取 1 次
// 驗證邏輯
if ($sec->token === $_POST['token']) {
echo "驗證通過";
// 此處讀取後 token 即自動銷毀,防止重放攻擊
} else {
echo "驗證失敗";
}
session_start() 之前或 Zend_Session 啟動後實例化,否則可能建立新 Session ID。User_、Admin_、Api_)。session.gc_maxlifetime 設定。靈活運用秒級過期與 Hops 限制,可實現從「登入態管理」到「一次性令牌」的多種安全模式,是 ZF1 Session 進階用法的核心。