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

Revision 23365, 8.4 KB checked in by Seasoft, 7 years ago (diff)

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

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