13,005
回編集
671行目: | 671行目: | ||
* セッションのセキュリティ設定 | * セッションのセキュリティ設定 | ||
* | * | ||
* 以下に示す設定は、本番環境では可能な限りphp.iniで設定することが推奨される | |||
* | |||
* 一部の設定はサーバーの設定によって変更が制限されている場合がある (php.ini_all等) | |||
* セッション開始後に変更しても効果がない設定がある | |||
* 実行時の設定変更 (ini_set関数) は、サーバ設定で無効化されている可能性がある | |||
* | |||
* session.cookie_httponly: JavaScriptからのクッキーアクセスを防止し、XSS攻撃によるセッションID漏洩を防ぐ | * session.cookie_httponly: JavaScriptからのクッキーアクセスを防止し、XSS攻撃によるセッションID漏洩を防ぐ | ||
* session.cookie_secure: HTTPS接続時のみクッキーを送信し、通信経路上での盗聴を防ぐ | * session.cookie_secure: HTTPS接続時のみクッキーを送信し、通信経路上での盗聴を防ぐ | ||
682行目: | 688行目: | ||
/** | /** | ||
* セッション管理クラス | * セッション管理クラス | ||
* | * ユーザの認証状態とセッションのライフサイクルを管理する | ||
*/ | */ | ||
class SessionManager | class SessionManager | ||
689行目: | 695行目: | ||
* コンストラクタ:セッションの初期化と設定 | * コンストラクタ:セッションの初期化と設定 | ||
* | * | ||
* cookie_lifetime: | * cookie_lifetime: セッションクッキーの有効期限 (ブラウザ終了後も持続) | ||
* gc_maxlifetime: | * gc_maxlifetime: セッションデータの有効期限 (サーバ側) | ||
* cookie_secure: HTTPSでの通信を強制 | * cookie_secure: HTTPSでの通信を強制 | ||
* cookie_httponly: JavaScriptからのアクセスを禁止 | * cookie_httponly: JavaScriptからのアクセスを禁止 | ||
699行目: | 705行目: | ||
session_start([ | session_start([ | ||
'cookie_lifetime' => 3600, // 1時間でセッション切れ | 'cookie_lifetime' => 3600, // 1時間でセッション切れ | ||
'gc_maxlifetime' => 3600, // | 'gc_maxlifetime' => 3600, // サーバ側でも1時間で破棄 | ||
'cookie_secure' => true, | 'cookie_secure' => true, | ||
'cookie_httponly' => true | 'cookie_httponly' => true | ||
709行目: | 715行目: | ||
* ユーザログイン処理 | * ユーザログイン処理 | ||
* | * | ||
* @param string $userId | * @param string $userId ユーザID | ||
* @param array $userData | * @param array $userData ユーザ情報の配列 | ||
* | * | ||
* セキュリティ対策: | * セキュリティ対策: | ||
841行目: | 847行目: | ||
{ | { | ||
/** | /** | ||
* | * ユーザ設定をクッキーに保存 | ||
* | * | ||
* @param string $key 設定キー | * @param string $key 設定キー | ||
892行目: | 898行目: | ||
if ($authenticated) { // 認証処理は別途実装必要 | if ($authenticated) { // 認証処理は別途実装必要 | ||
$sessionManager->login($userId, [ | $sessionManager->login($userId, [ | ||
'name' => ' | 'name' => 'テストユーザ', | ||
'email' => 'test@example.com' | 'email' => 'test@example.com' | ||
]); | ]); |