この記事はブロックされています。続きを読みたい方はログインをして下さい。会員ではない方は新規会員登録をして下さい。


ワードプレスでショッピングカートを作ろう その4 セッションハイジャック対策としてセッションIDを書き換える

今回はセッションハイジャック対策としてセッションIDを定期的に変更する方法です。
セッションハイジャックはユーザーが ログインした際に発行されるセッションIDを、ネットワーク上で盗聴されたり、規則性から類推されることで攻撃者がユーザーになりすます攻撃方法です。

対策方法として主に5つあります。

1.推測困難なセッションIDを利用すること
2.セッションIDをURLに含めないこと
3.HTTPS通信で利用しCookieにはsecure属性を付与すること
4.ログインする度にセッションを新規に開始すること
5.ログインする度にセッションIDとは別の秘密情報を持ち、各ページでその値をチェックすること

「1.推測困難なセッションIDを利用すること」についてはPHPの関数をそのまま使えば自動的にやってくれます。

「2.セッションIDをURLに含めないこと」についてはURLにセッションIDが含まれていると、ブラウザの履歴からURLを知られてセッションIDが割り出されてしまうおそれがあります。セッションIDはCookieで持つといいでしょう。
これもPHPの関数をそのまま使えば自動的にやってくれます。

「3.HTTPS通信で利用しCookieにはsecure属性を付与すること」についてはそのままですね。HTTPS通信が利用できない場合もあるかもしれませんが、対応していればHTTPS通信にしましょう。Cookieのsecure属性についてはPHPの関数が自動的にやってくれます。

1~3番についてはPHPの方で自動的にやってくれるのであまり心配する必要はありません。
大事なのは「4.ログインする度にセッションを新規に開始すること」「5.ログインする度にセッションIDとは別の秘密情報を持ち、各ページでその値をチェックすること」です。
4番と5番はいずれか行っていればOkです。

今回は「4.ログインする度にセッションを新規に開始すること」で対応します。

ログインする度にセッションを新規に開始するというのはどういうことかというと、ログインするごとにセッションIDを変えるということを意味します。変えないと同じIDを使い続けます。

セッションはブラウザを閉じるだけでは終了しません。Cookieは破棄されるのですがセッションの内容を記録したサーバーのファイルは残ります。
セッションを終了する場合は「session_destroy()」関数を使い明示的に終了させる必要があります。
セッションIDを変えるにはセッションIDを破棄し、取得するという処理が必要となります。

ややこしいのですが「session_destroy()」関数はセッションの終了を指示するだけで、セッション変数自体はそのまま残ります。
セッション変数は「$_SESSION = array();」を用いて初期化します。
セッション変数の初期化は明らかにセッション変数を引き継がない場合に初期化します。
例えばショッピングカートのお買い上げ後は明らかにセッション変数をもう使用しないため初期化します。

<?php

	//セッション変数を初期化
	$_SESSION = array() ;

	//セッションを破棄
	session_destroy() ;

?>

これでセッションが破棄できました。次にセッションを新規に取得する方法です。
セッションIDの書き換えは「session_regenerate_id()」関数を使います。
「session_regenerate_id()」関数はセッションIDを新しいものと置き換えるが、セッション情報を維持するという特徴があります。

「session_regenerate_id()」には引数を指定できます。「true」を指定すると旧いセッション情報を削除します。引数を指定しないとセッションIDを新しいものと置き換えますが、旧いセッション情報を残します。

以下のようにセッションIDが書き換わるかテストしてみます。

関連記事