source: branches/version-2_13-dev/data/class/helper/SC_Helper_Session.php @ 22856

Revision 22856, 7.9 KB checked in by Seasoft, 11 years ago (diff)

#2043 (typo修正・ソース整形・ソースコメントの改善 for 2.13.0)

  • 主に空白・空白行の調整。もう少し整えたいが、一旦現状コミット。
  • 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-2013 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    /**
21     * デフォルトコンストラクタ.
22     *
23     * 各関数をセッションハンドラに保存する
24     */
25    function __construct()
26    {
27        $this->objDb = new SC_Helper_DB_Ex();
28        session_set_save_handler(array(&$this, 'sfSessOpen'),
29                                 array(&$this, 'sfSessClose'),
30                                 array(&$this, 'sfSessRead'),
31                                 array(&$this, 'sfSessWrite'),
32                                 array(&$this, 'sfSessDestroy'),
33                                 array(&$this, 'sfSessGc'));
34
35        // 通常よりも早い段階(オブジェクトが書きされる前)でセッションデータを書き込んでセッションを終了する
36        // XXX APC による MDB2 の破棄タイミングによる不具合を回避する目的
37        register_shutdown_function('session_write_close');
38    }
39
40    /**
41     * セッションを開始する.
42     *
43     * @param string $save_path セッションを保存するパス(使用しない)
44     * @param string $session_name セッション名(使用しない)
45     * @return bool セッションが正常に開始された場合 true
46     */
47    function sfSessOpen($save_path, $session_name)
48    {
49        return true;
50    }
51
52    /**
53     * セッションを閉じる.
54     *
55     * @return bool セッションが正常に終了した場合 true
56     */
57    function sfSessClose()
58    {
59        return true;
60    }
61
62    /**
63     * セッションのデータをDBから読み込む.
64     *
65     * @param string $id セッションID
66     * @return string セッションデータの値
67     */
68    function sfSessRead($id)
69    {
70        $objQuery =& SC_Query_Ex::getSingletonInstance();
71        $arrRet = $objQuery->select('sess_data', 'dtb_session', 'sess_id = ?', array($id));
72        if (empty($arrRet)) {
73            return '';
74        } else {
75            return $arrRet[0]['sess_data'];
76        }
77    }
78
79    /**
80     * セッションのデータをDBに書き込む.
81     *
82     * @param string $id セッションID
83     * @param string $sess_data セッションデータの値
84     * @return bool セッションの書き込みに成功した場合 true
85     */
86    function sfSessWrite($id, $sess_data)
87    {
88        $objQuery =& SC_Query_Ex::getSingletonInstance();
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
107        return true;
108    }
109
110    // セッション破棄
111
112    /**
113     * セッションを破棄する.
114     *
115     * @param string $id セッションID
116     * @return bool セッションを正常に破棄した場合 true
117     */
118    function sfSessDestroy($id)
119    {
120        $objQuery =& SC_Query_Ex::getSingletonInstance();
121        $objQuery->delete('dtb_session', 'sess_id = ?', array($id));
122
123        return true;
124    }
125
126    /**
127     * ガーベジコレクションを実行する.
128     *
129     * 引数 $maxlifetime の代りに 定数 MAX_LIFETIME を使用する.
130     *
131     * @param integer $maxlifetime セッションの有効期限(使用しない)
132     */
133    function sfSessGc($maxlifetime)
134    {
135        // MAX_LIFETIME以上更新されていないセッションを削除する。
136        $objQuery =& SC_Query_Ex::getSingletonInstance();
137        $limit = date("Y-m-d H:i:s",time() - MAX_LIFETIME);
138        $where = "update_date < '". $limit . "' ";
139        $objQuery->delete('dtb_session', $where);
140
141        return true;
142    }
143
144    /**
145     * トランザクショントークンを生成し, 取得する.
146     *
147     * 悪意のある不正な画面遷移を防止するため, 予測困難な文字列を生成して返す.
148     * 同時に, この文字列をセッションに保存する.
149     *
150     * この関数を使用するためには, 生成した文字列を次画面へ渡すパラメーターとして
151     * 出力する必要がある.
152     *
153     * 例)
154     * <input type='hidden' name='transactionid' value="この関数の返り値" />
155     *
156     * 遷移先のページで, LC_Page::isValidToken() の返り値をチェックすることにより,
157     * 画面遷移の妥当性が確認できる.
158     *
159     * @access protected
160     * @return string トランザクショントークンの文字列
161     */
162    function getToken()
163    {
164        if (empty($_SESSION[TRANSACTION_ID_NAME])) {
165            $_SESSION[TRANSACTION_ID_NAME] = SC_Helper_Session_Ex::createToken();
166        }
167
168        return $_SESSION[TRANSACTION_ID_NAME];
169    }
170
171    /**
172     * トランザクショントークン用の予測困難な文字列を生成して返す.
173     *
174     * @access private
175     * @return string トランザクショントークン用の文字列
176     */
177    function createToken()
178    {
179        return sha1(uniqid(rand(), true));
180    }
181
182    /**
183     * トランザクショントークンの妥当性をチェックする.
184     *
185     * 生成されたトランザクショントークンの妥当性をチェックする.
186     * この関数を使用するためには, 前画面のページクラスで LC_Page::getToken()
187     * を呼んでおく必要がある.
188     *
189     * トランザクショントークンは, SC_Helper_Session::getToken() が呼ばれた際に
190     * 生成される.
191     * 引数 $is_unset が false の場合は, トークンの妥当性検証が不正な場合か,
192     * セッションが破棄されるまで, トークンを保持する.
193     * 引数 $is_unset が true の場合は, 妥当性検証後に破棄される.
194     *
195     * @access protected
196     * @param boolean $is_unset 妥当性検証後, トークンを unset する場合 true;
197     *                          デフォルト値は false
198     * @return boolean トランザクショントークンが有効な場合 true
199     */
200    function isValidToken($is_unset = false)
201    {
202        // token の妥当性チェック
203        $ret = $_REQUEST[TRANSACTION_ID_NAME] === $_SESSION[TRANSACTION_ID_NAME];
204
205        if ($is_unset || $ret === false) {
206            SC_Helper_Session_Ex::destroyToken();
207        }
208
209        return $ret;
210    }
211
212    /**
213     * トランザクショントークンを破棄する.
214     *
215     * @return void
216     */
217    function destroyToken()
218    {
219        unset($_SESSION[TRANSACTION_ID_NAME]);
220    }
221
222    /**
223     * 管理画面の認証を行う.
224     *
225     * mtb_auth_excludes へ登録されたページは, 認証を除外する.
226     *
227     * @return void
228     */
229    function adminAuthorization()
230    {
231        $masterData = new SC_DB_MasterData_Ex();
232        $arrExcludes = $masterData->getMasterData('mtb_auth_excludes');
233        if (preg_match('|^' . ROOT_URLPATH . ADMIN_DIR . '|', $_SERVER['SCRIPT_NAME'])) {
234            $is_auth = true;
235
236            foreach ($arrExcludes as $exclude) {
237                if (preg_match('|^' . ROOT_URLPATH . ADMIN_DIR . $exclude . '|', $_SERVER['SCRIPT_NAME'])) {
238                    $is_auth = false;
239                    break;
240                }
241            }
242            if ($is_auth) {
243                SC_Utils_Ex::sfIsSuccess(new SC_Session_Ex());
244            }
245        }
246    }
247}
Note: See TracBrowser for help on using the repository browser.