ダウンロード sample.zip (14.7 KB)
URL埋め込み方式を用いる際のセキュリティ対策
session.use_trans_sidパラメータによって付加されるセッションを示す引数「SessionID=XXXXXX」が推測され悪意あるアクセスに晒されるという危険性が考えられます。
この危険性を回避するためにセッションIDが出力されるたびに値を新しいものに置き換えるPHP関数 session_regenerate_id()があります。
HTTP_Session2ではregenerateId()というメソッドでsession_regenerate_id()関数を呼び出せます。
このメソッドを使ってセッションIDを置き換えるメソッドをSession.class.php内にも実装します。
function Session(){
# 略
HTTP_Session2::regenerateId(true);
}
セッションIDを置き換えるメソッドをコンストラクタに追加しています。
このようにすることでSession.class.phpが呼ばれるたびにセッションIDが新しいものに置き換えられます。

「トップ」リンクから再度index.phpにアクセスすると上記のようにセッションIDの値が前項のときの値と変わっているのが分かります。
regenerateId()メソッドを使用した後、ブラウザのバックボタンで戻った際、画面を更新する際にセッションが切れてしまうことがあります。
ブラウザの「進む」「戻る」での動作が多いと想定されるサイトや更新ボタンでの画面確認が多いサイトでは利用を避けたほうがいいです。
また、外部へセッションIDが漏れないようにするため会員制サイトから直接外部サイトへリンクしない、リンクする際にはリファラを送出しないページを挟む、といった対策が必要となります。
ユーザー情報変更
ユーザー情報変更はproofile.php内でSession.class.phpのupdateメソッドを呼び出して行います。
POSTされたuser_id, 旧・新password, user_nameを渡してDB更新後、セッションも更新します。
// id取得
$user_id = $_POST['user_id'];
// 旧パスワード取得
$old_password = $_POST['old_password'];
// 新パスワード取得
$new_password = $_POST['new_password'];
// user_name取得
$user_name = $_POST['user_name'];
// セッションクラス
$ss = & new Session();
if($user_id && $old_password && $new_password && $user_name){
$ss->update($user_id, $old_password, $new_password, $user_name);
}
function update($user_id, $old_password, $new_password, $user_name){
$pdo = new PDO(dbType.":host=".MYSQL_HOST."; dbname=".MYSQL_DATABASE , MYSQL_USER, MYSQL_PASSWORD);
// user_id, 旧パスワードでチェック
$stmt = $pdo->prepare("SELECT id, user_id, user_name, uid FROM user where user_id = ? AND password = ?");
$old_password = md5(str . $old_password);
$stmt->execute(array($user_id, $old_password));
$rowCount = $stmt->rowCount();
if(!$rowCount) return false;
// セッションからデータを取得
$_userInfo = $this->getSession();
// データ更新
$stmt = $pdo->prepare("UPDATE user SET user_id = ?, password = ?, user_name = ? WHERE id = ?");
$new_password = md5(str . $new_password);
$stmt->execute(array($user_id, $new_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まで見に行かずセッションを参照するだけでよいことになります。
- 修正履歴
-
- 2010/10/11 22:48 PHP内部文字コードと出力文字コードを分ける処理を追加
- 2010/10/07 17:01 パスワード保存時の処理を変更
- 2010/10/06 14:15 かんたんログイン利用時の注意点を追加
- 2010/10/03 22:44 MySQLへの接続の際の文字コード指定、簡単ログインの際に携帯キャリアのIPアドレスか判定する処理を追加
この記事は参考になりましたか?
- 目的に応じて適材適所で使うPHPライブラリ連載記事一覧
-
- PHPで作成する携帯会員サイトの基本
- PHPUnitでできる単体テスト
- PHPで行う動画変換(後編)
- この記事の著者
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
WINGSプロジェクト 片渕 彼富(カタフチ カノトミ)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
