source: branches/version-2_5-dev/data/class/helper/SC_Helper_Session.php @ 20116

Revision 20116, 6.4 KB checked in by nanasess, 15 years ago (diff)
  • svn properties を再設定
  • 再設定用のスクリプト追加
  • 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-2010 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();
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();
86         $count = $objQuery->count("dtb_session", "sess_id = ?", array($id));
87         $sqlval = array();
88         if($count > 0) {
89             // レコード更新
90             $sqlval['sess_data'] = $sess_data;
91             $sqlval['update_date'] = 'Now()';
92             $objQuery->update("dtb_session", $sqlval, "sess_id = ?", array($id));
93         } else {
94             // セッションデータがある場合は、レコード作成
95             if(strlen($sess_data) > 0) {
96                 $sqlval['sess_id'] = $id;
97                 $sqlval['sess_data'] = $sess_data;
98                 $sqlval['update_date'] = 'Now()';
99                 $sqlval['create_date'] = 'Now()';
100                 $objQuery->insert("dtb_session", $sqlval);
101             }
102         }
103         return true;
104     }
105
106     // セッション破棄
107
108     /**
109      * セッションを破棄する.
110      *
111      * @param string $id セッションID
112      * @return bool セッションを正常に破棄した場合 true
113      */
114     function sfSessDestroy($id) {
115         $objQuery = new SC_Query();
116         $objQuery->delete("dtb_session", "sess_id = ?", array($id));
117         return true;
118     }
119
120     /**
121      * ガーベジコレクションを実行する.
122      *
123      * 引数 $maxlifetime の代りに 定数 MAX_LIFETIME を使用する.
124      *
125      * @param integer $maxlifetime セッションの有効期限(使用しない)
126      */
127     function sfSessGc($maxlifetime) {
128         // MAX_LIFETIME以上更新されていないセッションを削除する。
129         $objQuery = new SC_Query();
130         $where = "update_date < current_timestamp + '-". MAX_LIFETIME . " secs'";
131         $objQuery->delete("dtb_session", $where);
132         return true;
133    }
134
135    /**
136     * トランザクショントークンを生成し, 取得する.
137     *
138     * 悪意のある不正な画面遷移を防止するため, 予測困難な文字列を生成して返す.
139     * 同時に, この文字列をセッションに保存する.
140     *
141     * この関数を使用するためには, 生成した文字列を次画面へ渡すパラメータとして
142     * 出力する必要がある.
143     *
144     * 例)
145     * <input type="hidden" name="transactionid" value="この関数の返り値" />
146     *
147     * 遷移先のページで, LC_Page::isValidToken() の返り値をチェックすることにより,
148     * 画面遷移の妥当性が確認できる.
149     *
150     * @access protected
151     * @return string トランザクショントークンの文字列
152     */
153    function getToken() {
154        if (empty($_SESSION[TRANSACTION_ID_NAME])) {
155            $_SESSION[TRANSACTION_ID_NAME] = SC_Helper_Session_Ex::createToken();
156        }
157        return $_SESSION[TRANSACTION_ID_NAME];
158    }
159
160    /**
161     * トランザクショントークン用の予測困難な文字列を生成して返す.
162     *
163     * @access private
164     * @return string トランザクショントークン用の文字列
165     */
166    function createToken() {
167        return sha1(uniqid(rand(), true));
168    }
169
170    /**
171     * トランザクショントークンの妥当性をチェックする.
172     *
173     * 前画面で生成されたトランザクショントークンの妥当性をチェックする.
174     * この関数を使用するためには, 前画面のページクラスで LC_Page::getToken()
175     * を呼んでおく必要がある.
176     *
177     * @access protected
178     * @return boolean トランザクショントークンが有効な場合 true
179     */
180    function isValidToken() {
181
182        $checkToken = "";
183
184        // $_POST の値を優先する
185        if (isset($_POST[TRANSACTION_ID_NAME])) {
186
187            $checkToken = $_POST[TRANSACTION_ID_NAME];
188        } elseif (isset($_GET[TRANSACTION_ID_NAME])) {
189
190            $checkToken = $_GET[TRANSACTION_ID_NAME];
191        }
192
193        $ret = false;
194        // token の妥当性チェック
195        if ($checkToken === $_SESSION[TRANSACTION_ID_NAME]) {
196
197            $ret = true;
198        }
199
200        unset($_SESSION[TRANSACTION_ID_NAME]);
201        return $ret;
202    }
203}
204?>
Note: See TracBrowser for help on using the repository browser.