PHPでのセッション管理
PHPでのセッション管理は1)クッキーを使う方式、2)内部リンクのURLの後ろに引数としてセッションIDを付与する方式(URL埋め込み方式)の2通りあります。
前述のとおり、携帯電話の多くはクッキーにまだ対応していませんので2)のURL埋め込み方式をとります。
php.iniに以下の2つのパラメーターを使って2)のURL埋め込み方式を実装します。
パラメータ名 | 意味 |
session.use_trans_sid | セッションが有効な場合、セッションIDをURLに自動で付加する |
session.use_cookies | セッションにクッキーを使用する |
それぞれ有効:1、無効:0の値で設定します。
今回のサンプルは携帯が対象となるシステムなので「session.use_trans_sid」の他に「session.use_cookies」でクッキーにセッションを持たないようにして以下のようにphp.iniに設定します。
session.use_trans_sid = 1 session.use_cookies = 0
レンタルサーバーの制約などでphp.iniの変更ができない場合はApacheの.htaccessで同じ設定ができます。
php_flag session.use_trans_sid On php_flag session.use_cookies Off
上記の設定を行ってPHP内でセッションが開始された場合、リンクの後ろにはには「SESSID=XXXXX」、フォーム内には<input type="hidden" name="SESSID" value="XXXXX" />のようにセッションを遷移先の画面へ引き継げるようなIDと値のペアが自動で付加されます。
サンプル実行用のデータ作成
以下のSQLを実行してテーブルを作成します。
CREATE TABLE IF NOT EXISTS `user` ( `id` int(11) NOT NULL auto_increment COMMENT 'ID', `user_id` varchar(32) NOT NULL COMMENT 'ユーザーID', `password` varchar(32) NOT NULL COMMENT 'パスワード', `user_name` varchar(32) default NULL COMMENT 'ユーザー名', `uid` varchar(48) NOT NULL COMMENT '携帯端末ID', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
次にinsert.phpに携帯電話からアクセスして「user_id」「password」「user_name」を入力してテストデータを作成します。
この際に携帯電話の端末IDも取得してユーザーデータを作成します。携帯端末で端末IDを送出しないように設定している場合は解除してからアクセスします。
DB接続情報はconfig.phpに記述して、データ作成はPDOを用います。
.htaccessを利用してPHPプログラムの文字コードはUTF-8とし、画面出力時の文字コードをSJISにしています。 これはUTF-8に対応していない携帯電話もあるためです。Smartyの使い方は本連載第7回をご確認ください。
define('MYSQL_HOST' , 'MySQLサーバーのアドレス'); define('MYSQL_USER' , 'MySQLユーザー名'); define('MYSQL_PASSWORD' , 'MySQLユーザーのパスワード'); define('MYSQL_DATABASE' , 'データベース名'); define('dbType' , "mysql"); define('str' , '任意の文字列');
function MySmarty(){ $this->Smarty(); $this->template_dir="templates"; $this->compile_dir="templates_c"; $this->default_modifiers = array('escape:"html":"UTF-8"'); } // テンプレートを出力 function show($template){ // DoCoMoの場合にはxhtml表示ヘッダを送信 if(preg_match("/^DoCoMo/",$_SERVER["HTTP_USER_AGENT"])){ header("Content-Type: application/xhtml+xml; charset=Shift_JIS"); } $this->display($template); }
// ユーザーID取得 $user_id = $_POST['user_id']; // パスワード取得 $password = $_POST['password']; // ユーザー名取得 $user_name = $_POST['user_name']; if($user_name){ // 端末IDを取得 $agent = Net_UserAgent_Mobile::singleton(); $uid = $agent->getUID(); // DB接続 $pdo = new PDO(dbType.":host=".MYSQL_HOST."; dbname=".MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD); $stmt = $pdo->prepare("INSERT INTO user (user_id, password, user_name, uid) VALUES(:USER_ID, :PASSWORD, :USER_NAME, :UID)"); // ユーザーデータ作成 $stmt->bindValue(':USER_ID', $user_id); $stmt->bindValue(':PASSWORD', md5(str . $password)); $stmt->bindValue(':USER_NAME', $user_name); $stmt->bindValue(':UID', $uid); $stmt->execute(); }
XSS(クロスサイトスクリプティング)の虚弱性を回避するためにSmartyのdefault_modifiersに修飾子escapeを設定しています。 サンプルではconfig,phpをinsert.phpと同じディレクトリに配置しておりますが、実際のシステム開発ではドキュメントルートの外に配置して下さい。
パスワードを保存する際にはmd5関数を使って暗号化します。サンプルではそのままではなく、config,php内で設定した任意の文字列を付け足して暗号化しています。 ユーザーごとに文字列を定義するとより安全にパスワードを保存できます。
サンプルではユーザーID「123」、パスワード「abc」、ユーザー名「鳩山」で作成しています。