PHPでは、セッション処理メカニズムをカスタマイズするときに、セッションハンドラーインターフェイスを実装するか、セッションハンドラークラスを継承することにより、セッションストレージロジックをカスタマイズできます。その中で、 sessionhandler :: create_sid()は、セッションIDを生成するために使用される書き換え可能な方法です。この方法のリターン値とその目的を理解することは、複雑なセッションメカニズムをデバッグするために特に重要です。
create_sid()は、session_start()が呼び出されたときに自動的に呼び出され、現在有効なセッションIDはありません。その目的は、新しいユニークなセッションID文字列を返すことです。デフォルトの実装は、 session.sid_lengthとsession.sid_bits_per_characterに基づいて高いエントロピーIDを生成しますが、ロジックをカスタマイズしてセッションIDの生成方法を制御することもできます。
class MySessionHandler extends SessionHandler {
public function create_sid(): string {
return hash('sha256', random_bytes(32));
}
}
session_set_save_handler(new MySessionHandler(), true);
session_start();
上記のコードでは、SHA-256を使用して32バイトのランダムデータがあり、一意のセッションIDを生成します。返された値は似ています。
82c4ad45fef0c9f0ed72cd3e78c0f5e5c7e35a8f70e94dfd6a5f1a15f2b19e73
create_sid()によって返される文字列は、次のポイントを満たす必要があります。
一意性:特定の時間範囲内で繰り返してはなりません。
予測不可能:セッションハイジャックを簡単に推測して防ぐことはできません。
session.use_strict_mode = 1と互換性があります:Strictモードが有効になっている場合、返されたセッションIDが既にストレージに存在する場合、拒否され、再生されます。
上記の条件を満たさないと、セッションの競合やセキュリティの脆弱性につながる可能性があります。
create_sid()をデバッグする最も直接的な方法は、ロギングと追跡情報を一時的に追加することです。
public function create_sid(): string {
$sid = hash('sha256', random_bytes(32));
error_log("新しいセッションを作成します ID: $sid");
return $sid;
}
これにより、生成された各SIDがPHPエラーログに書き込み、パスは通常/var/log/php_errors.logです。またはphp.ini経由で構成されます。
ブラウザで開発者ツール(Chromeのネットワークタグなど)を使用して、リクエストでセットクーキー応答ヘッダーを表示し、サーバーによって返されたセッションIDが生成するコンテンツであるかどうかを確認します。
たとえば、ヘッダーに戻ると、次のようになります。
Set-Cookie: PHPSESSID=82c4ad45fef0c9f0ed72cd3e78c0f5e5c7e35a8f70e94dfd6a5f1a15f2b19e73; path=/; HttpOnly
このIDを使用したセッションデータが実際にストレージバックエンド(Redis、ファイルシステム、データベースなど)に保存されているかどうかを確認してください。たとえば、セッションをRedisに保存する場合:
$sessionKey = "PHPREDIS_SESSION:sess_$sid";
コマンドを使用できます。
GET PHPREDIS_SESSION:sess_82c4ad45fef0c9f0ed72cd3e78c0f5e5c7e35a8f70e94dfd6a5f1a15f2b19e73
セッションキーが存在するかどうかを確認します。
デバッグページを一時的に作成して、現在のセッションIDとステータスを表示できます。
session_start();
echo "<pre>現在 Session ID: " . session_id() . "</pre>";
echo "<pre>Session コンテンツ: ";
print_r($_SESSION);
echo "</pre>";
ページにアクセスした後の出力は似ています。
現在 Session ID: 82c4ad45fef0c9f0ed72cd3e78c0f5e5c7e35a8f70e94dfd6a5f1a15f2b19e73
Session コンテンツ: Array
(
)
クライアントがCookieをサポートしていない場合は、セッションIDをURLに添付してデバッグできます。
https://gitbox.net/debug.php?PHPSESSID=82c4ad45fef0c9f0ed72cd3e78c0f5e5c7e35a8f70e94dfd6a5f1a15f2b19e73
ただし、注:この方法は、開発環境のデバッグにのみ適しています。生産環境では、URLを無効にしてセッションIDを携帯してセッションの漏れを避けます。
session.use_strict_mode = 1を有効にして、PHPに既存のSIDを拒否させるように強制します。
session.save_pathを読み取りや書き込みが簡単なディレクトリに構成して、元のセッションファイルの表示を容易にします。
PHP.iniまたは.htaccessでの高レベルのエラーレポートとログイングを一時的に開きます。
error_reporting = E_ALL
display_errors = On
log_errors = On
error_log = /tmp/php_error.log