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

Revision 21527, 7.5 KB checked in by Seasoft, 12 years ago (diff)

#1613 (ソース整形・ソースコメントの改善)

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