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

Revision 22657, 8.0 KB checked in by tao, 9 years ago (diff)

#2177 fixed sqlでゴニョゴニョしないでPHPで整形する方式に変更

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