source: branches/version-2_12-dev/data/class/helper/SC_Helper_Session.php @ 21704

Revision 21704, 7.8 KB checked in by Seasoft, 10 years ago (diff)

#1717 (URL のファイルパス部の取得は PHP_SELF の代わりに SCRIPT_NAME を使用する)

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-httpd-php; charset=UTF-8
Line 
1<?php
2/*
3 * Copyright(c) 2000-2011 LOCKON CO.,LTD. All Rights Reserved.
4 *
5 * http://www.lockon.co.jp/
6 */
7
8/**
9 * セッション関連のヘルパークラス.
10 *
11 * @package Helper
12 * @author LOCKON CO.,LTD.
13 * @version $Id$
14 */
15class SC_Helper_Session {
16
17    var $objDb;
18
19    // }}}
20    // {{{ constructor
21
22    /**
23     * デフォルトコンストラクタ.
24     *
25     * 各関数をセッションハンドラに保存する
26     */
27    function SC_Helper_Session() {
28        $this->objDb = new SC_Helper_DB_Ex();
29        session_set_save_handler(array(&$this, 'sfSessOpen'),
30                                 array(&$this, 'sfSessClose'),
31                                 array(&$this, 'sfSessRead'),
32                                 array(&$this, 'sfSessWrite'),
33                                 array(&$this, 'sfSessDestroy'),
34                                 array(&$this, 'sfSessGc'));
35
36        // 通常よりも早い段階(オブジェクトが書きされる前)でセッションデータを書き込んでセッションを終了する
37        // XXX APC による MDB2 の破棄タイミングによる不具合を回避する目的
38        register_shutdown_function('session_write_close');
39    }
40
41    // }}}
42    // {{{ functions
43
44    /**
45     * セッションを開始する.
46     *
47     * @param string $save_path セッションを保存するパス(使用しない)
48     * @param string $session_name セッション名(使用しない)
49     * @return bool セッションが正常に開始された場合 true
50     */
51    function sfSessOpen($save_path, $session_name) {
52        return true;
53    }
54
55    /**
56     * セッションを閉じる.
57     *
58     * @return bool セッションが正常に終了した場合 true
59     */
60    function sfSessClose() {
61        return true;
62    }
63
64    /**
65     * セッションのデータをDBから読み込む.
66     *
67     * @param string $id セッションID
68     * @return string セッションデータの値
69     */
70    function sfSessRead($id) {
71        $objQuery = new SC_Query_Ex();
72        $arrRet = $objQuery->select('sess_data', 'dtb_session', 'sess_id = ?', array($id));
73        if (empty($arrRet)) {
74            return '';
75        } else {
76            return $arrRet[0]['sess_data'];
77        }
78    }
79
80    /**
81     * セッションのデータをDBに書き込む.
82     *
83     * @param string $id セッションID
84     * @param string $sess_data セッションデータの値
85     * @return bool セッションの書き込みに成功した場合 true
86     */
87    function sfSessWrite($id, $sess_data) {
88        $objQuery = new SC_Query_Ex();
89        $exists = $objQuery->exists('dtb_session', 'sess_id = ?', array($id));
90        $sqlval = array();
91        if ($exists) {
92            // レコード更新
93            $sqlval['sess_data'] = $sess_data;
94            $sqlval['update_date'] = 'CURRENT_TIMESTAMP';
95            $objQuery->update('dtb_session', $sqlval, 'sess_id = ?', array($id));
96        } else {
97            // セッションデータがある場合は、レコード作成
98            if (strlen($sess_data) > 0) {
99                $sqlval['sess_id'] = $id;
100                $sqlval['sess_data'] = $sess_data;
101                $sqlval['update_date'] = 'CURRENT_TIMESTAMP';
102                $sqlval['create_date'] = 'CURRENT_TIMESTAMP';
103                $objQuery->insert('dtb_session', $sqlval);
104            }
105        }
106        return true;
107    }
108
109    // セッション破棄
110
111    /**
112     * セッションを破棄する.
113     *
114     * @param string $id セッションID
115     * @return bool セッションを正常に破棄した場合 true
116     */
117    function sfSessDestroy($id) {
118        $objQuery = new SC_Query_Ex();
119        $objQuery->delete('dtb_session', 'sess_id = ?', array($id));
120        return true;
121    }
122
123    /**
124     * ガーベジコレクションを実行する.
125     *
126     * 引数 $maxlifetime の代りに 定数 MAX_LIFETIME を使用する.
127     *
128     * @param integer $maxlifetime セッションの有効期限(使用しない)
129     */
130    function sfSessGc($maxlifetime) {
131        // MAX_LIFETIME以上更新されていないセッションを削除する。
132        $objQuery = new SC_Query_Ex();
133        $where = "update_date < current_timestamp + '-". MAX_LIFETIME . " secs'";
134        $objQuery->delete('dtb_session', $where);
135        return true;
136    }
137
138    /**
139     * トランザクショントークンを生成し, 取得する.
140     *
141     * 悪意のある不正な画面遷移を防止するため, 予測困難な文字列を生成して返す.
142     * 同時に, この文字列をセッションに保存する.
143     *
144     * この関数を使用するためには, 生成した文字列を次画面へ渡すパラメーターとして
145     * 出力する必要がある.
146     *
147     * 例)
148     * <input type='hidden' name='transactionid' value="この関数の返り値" />
149     *
150     * 遷移先のページで, LC_Page::isValidToken() の返り値をチェックすることにより,
151     * 画面遷移の妥当性が確認できる.
152     *
153     * @access protected
154     * @return string トランザクショントークンの文字列
155     */
156    function getToken() {
157        if (empty($_SESSION[TRANSACTION_ID_NAME])) {
158            $_SESSION[TRANSACTION_ID_NAME] = SC_Helper_Session_Ex::createToken();
159        }
160        return $_SESSION[TRANSACTION_ID_NAME];
161    }
162
163    /**
164     * トランザクショントークン用の予測困難な文字列を生成して返す.
165     *
166     * @access private
167     * @return string トランザクショントークン用の文字列
168     */
169    function createToken() {
170        return sha1(uniqid(rand(), true));
171    }
172
173    /**
174     * トランザクショントークンの妥当性をチェックする.
175     *
176     * 生成されたトランザクショントークンの妥当性をチェックする.
177     * この関数を使用するためには, 前画面のページクラスで LC_Page::getToken()
178     * を呼んでおく必要がある.
179     *
180     * トランザクショントークンは, SC_Helper_Session::getToken() が呼ばれた際に
181     * 生成される.
182     * 引数 $is_unset が false の場合は, トークンの妥当性検証が不正な場合か,
183     * セッションが破棄されるまで, トークンを保持する.
184     * 引数 $is_unset が true の場合は, 妥当性検証後に破棄される.
185     *
186     * @access protected
187     * @param boolean $is_unset 妥当性検証後, トークンを unset する場合 true;
188     *                          デフォルト値は false
189     * @return boolean トランザクショントークンが有効な場合 true
190     */
191    function isValidToken($is_unset = false) {
192        // token の妥当性チェック
193        $ret = $_REQUEST[TRANSACTION_ID_NAME] === $_SESSION[TRANSACTION_ID_NAME];
194
195        if ($is_unset || $ret === false) {
196            SC_Helper_Session_Ex::destroyToken();
197        }
198        return $ret;
199    }
200
201    /**
202     * トランザクショントークンを破棄する.
203     *
204     * @return void
205     */
206    function destroyToken() {
207        unset($_SESSION[TRANSACTION_ID_NAME]);
208    }
209
210    /**
211     * 管理画面の認証を行う.
212     *
213     * mtb_auth_excludes へ登録されたページは, 認証を除外する.
214     *
215     * @return void
216     */
217    function adminAuthorization() {
218        $masterData = new SC_DB_MasterData_Ex();
219        $arrExcludes = $masterData->getMasterData('mtb_auth_excludes');
220        if (preg_match('|^' . ROOT_URLPATH . ADMIN_DIR . '|', $_SERVER['SCRIPT_NAME'])) {
221            $is_auth = true;
222
223            foreach ($arrExcludes as $exclude) {
224                if (preg_match('|^' . ROOT_URLPATH . ADMIN_DIR . $exclude . '|', $_SERVER['SCRIPT_NAME'])) {
225                    $is_auth = false;
226                    break;
227                }
228            }
229            if ($is_auth) {
230                SC_Utils_Ex::sfIsSuccess(new SC_Session_Ex());
231            }
232        }
233    }
234}
Note: See TracBrowser for help on using the repository browser.