SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

目的に応じて適材適所で使うPHPライブラリ

PHPで作成する携帯会員サイトの基本

目的に応じて適材適所で使うPHPライブラリ(11)


  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード sample.zip (14.7 KB)

PHPでのセッション管理

 PHPでのセッション管理は1)クッキーを使う方式、2)内部リンクのURLの後ろに引数としてセッションIDを付与する方式(URL埋め込み方式)の2通りあります。

 前述のとおり、携帯電話の多くはクッキーにまだ対応していませんので2)のURL埋め込み方式をとります。

 php.iniに以下の2つのパラメーターを使って2)のURL埋め込み方式を実装します。

URL埋め込み方式で利用するパラメーター
パラメータ名 意味
session.use_trans_sid セッションが有効な場合、セッションIDをURLに自動で付加する
session.use_cookies セッションにクッキーを使用する

 それぞれ有効:1、無効:0の値で設定します。

 今回のサンプルは携帯が対象となるシステムなので「session.use_trans_sid」の他に「session.use_cookies」でクッキーにセッションを持たないようにして以下のようにphp.iniに設定します。

リスト2 php.iniの設定例
session.use_trans_sid = 1
session.use_cookies = 0

 レンタルサーバーの制約などでphp.iniの変更ができない場合はApacheの.htaccessで同じ設定ができます。

リスト3 .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を実行してテーブルを作成します。

リスト4 テーブルの作成
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回をご確認ください。

リスト5 config.php
define('MYSQL_HOST' , 'MySQLサーバーのアドレス');
define('MYSQL_USER' , 'MySQLユーザー名');
define('MYSQL_PASSWORD' , 'MySQLユーザーのパスワード');
define('MYSQL_DATABASE' , 'データベース名');
define('dbType' , "mysql");
define('str' , '任意の文字列');
リスト6 MySmarty.class.php(抜粋)
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);
}
リスト7 insert.php(抜粋)
// ユーザー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」、ユーザー名「鳩山」で作成しています。

次のページ
セッション管理クラスの作成

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
目的に応じて適材適所で使う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本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 片渕 彼富(カタフチ カノトミ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5430 2010/10/18 14:50

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング