アクセス頻度制御やセッション有効期限管理を実装する際、Cookieやセッションストレージを活用した軽量なアプローチが有効です。以下に具体的な実装パターンを示します。
/**
* アクセス頻度制御マネージャー
* 指定時間枠内でのリクエスト回数をカウントし、閾値超過時に検証を要求
*
* @param string $endpoint 現在のエンドポイント識別子
* @param int $action 1:カウント増加, 2:制限状態確認
* @return bool|null 制限超過時はtrueを返す
*/
function access_throttle_manager($endpoint = 'default', $action = 1) {
$tokenKey = 'throttle_' . $endpoint;
$threshold = 5;
$validPeriod = 300; // 5分
if ($action === 1) {
$current = isset($_COOKIE[$tokenKey]) ? (int)$_COOKIE[$tokenKey] : 0;
setcookie($tokenKey, $current + 1, time() + $validPeriod, '/', '', true, true);
}
elseif ($action === 2) {
return isset($_COOKIE[$tokenKey]) && (int)$_COOKIE[$tokenKey] >= $threshold;
}
return null;
}
利用例として、ログイン処理で頻度制御を適用する場合:
public function login_handler() {
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
access_throttle_manager('login', 1);
// 認証処理実装
} else {
$requiresCaptcha = access_throttle_manager('login', 2);
$this->viewData['captcha_required'] = $requiresCaptcha;
$this->render('login');
}
}
セッションベースの有効期限制御では、最終アクセス時刻を別途記録する手法が有効です。PHPネイティブのセッション管理に独自の有効期間を付与する実装例:
/**
* 有効期限付きセッションデータ操作
*
* @param int $mode 1:保存, 2:取得, 3:削除
* @param string $key データ識別子
* @param mixed $value 保存する値
* @param int $ttl 有効期間(秒)
* @return mixed 取得モード時のデータ
*/
function timed_session($mode, $key, $value = null, $ttl = 1800) {
$timestampKey = "{$key}_timestamp";
switch ($mode) {
case 1: // データ保存
$_SESSION[$key] = $value;
$_SESSION[$timestampKey] = time();
break;
case 2: // データ取得
if (!isset($_SESSION[$timestampKey]) ||
(time() - $_SESSION[$timestampKey] > $ttl)) {
timed_session(3, $key);
return null;
}
return $_SESSION[$key];
case 3: // データ削除
unset($_SESSION[$key], $_SESSION[$timestampKey]);
}
}
自動ログイン機能実装では、暗号化された永続クッキーを活用します。ログインコントローラーの基底クラスで次のように実装:
abstract class AuthController {
public function __construct() {
if (!isset($_SESSION['user_id']) && isset($_COOKIE['auth_token'])) {
$decrypted = $this->decrypt_token($_COOKIE['auth_token']);
if ($decrypted && $this->validate_credentials($decrypted)) {
$this->restore_session($decrypted);
}
}
}
private function decrypt_token($token) {
// AES-256-GCMによる復号処理を実装
// 有効期限検証も同時に行う
}
}
ログアウト時には必ずクッキーを無効化する必要があります:
public function logout() {
setcookie('auth_token', '', time() - 3600, '/');
session_destroy();
// リダイレクト処理
}
中国語文字列の整形には、文字数に応じたスペース補完関数を使用:
function pad_chinese_text($text, $targetLength = 4) {
$currentLength = mb_strlen($text, 'UTF-8');
if ($currentLength < $targetLength) {
return $text . str_repeat(' ', $targetLength - $currentLength);
}
return $text;
}