URL埋め込み方式を用いる際のセキュリティ対策
session.use_trans_sidパラメータによって付加されるセッションを示す引数「SessionID=XXXXXX」が推測され悪意あるアクセスに晒されるという危険性が考えられます。
この危険性を回避するためにセッションIDが出力されるたびに値を新しいものに置き換えるPHP関数 session_regenerate_id()があります。
HTTP_Session2ではregenerateId()というメソッドでsession_regenerate_id()関数を呼び出せます。
このメソッドを使ってセッションIDを置き換えるメソッドをSession.class.php内にも実装します。
function __construct(){
# 略
HTTP_Session2::regenerateId(true);
}
セッションIDを置き換えるメソッドをコンストラクタに追加しています。
このようにすることでSession.class.phpが呼ばれるたびにセッションIDが新しいものに置き換えられます。
「トップ」リンクから再度index.phpにアクセスすると上記のようにセッションIDの値が前項のときの値と変わっているのが分かります。
ユーザー情報変更
ユーザー情報変更はproofile.php内でSession.class.phpのupdateメソッドを呼び出して行います。
POSTされたuser_id, password, user_nameを渡してDB更新後、セッションも更新します。
// id取得
$user_id = $_POST['user_id'];
// password取得
$password = $_POST['password'];
// user_name取得
$user_name = $_POST['user_name'];
// セッションクラス
$ss = & new Session();
if($user_id && $password && $user_name){
$ss->update($user_id, $password, $user_name);
}
function update($user_id, $password, $user_name){
$pdo = new PDO(dbType.":host=".MYSQL_HOST."; dbname=".MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD,
array( PDO::MYSQL_ATTR_READ_DEFAULT_FILE => OPTION_CNF ));
// セッションからデータを取得
$_userInfo = $this->getSession();
// データ更新
$stmt = $pdo->prepare("UPDATE user SET user_id = ?, password = ?, user_name = ? WHERE id = ?");
$stmt->execute(array($user_id, md5($password), $user_name, $_userInfo['id']));
// 更新後のデータを再度セッションに置く
$stmt = $pdo->prepare("SELECT id, user_id, user_name, uid FROM user where id = ? ");
$stmt->execute(array($_userInfo['id']));
$row = $stmt->fetch(PDO::FETCH_ASSOC);
HTTP_Session2::set('user', $row);
}
updateメソッド内でセッション内のユーザーデータを更新しておくことで、次回以降ユーザーデータを参照する際にはDBまで見に行かずセッションを参照するだけでよいことになります。