source: branches/version-2_11-dev/data/class/helper/SC_Helper_Session.php @ 21401

Revision 21401, 7.7 KB checked in by Seasoft, 12 years ago (diff)

2.12系へマイルストーン変更となったチケット分を差し戻し
r21382 #1526 (本来対象外だが、作業を簡単にするため含めた)
r21381 #1586
r21380 #1586
r21379 #1585
r21378 #1582

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