OSDN Git Service

初回コミット(v2.6.17.1)
[magic3/magic3.git] / include / manager / requestManager.php
1 <?php
2 /**
3  * HTTPリクエスト、レスポンス、セッション管理マネージャー
4  *
5  * PHP versions 5
6  *
7  * LICENSE: This source file is licensed under the terms of the GNU General Public License.
8  *
9  * @package    Magic3 Framework
10  * @author     平田直毅(Naoki Hirata) <naoki@aplo.co.jp>
11  * @copyright  Copyright 2006-2011 Magic3 Project.
12  * @license    http://www.gnu.org/copyleft/gpl.html  GPL License
13  * @version    SVN: $Id: requestManager.php 6048 2013-05-28 11:09:49Z fishbone $
14  * @link       http://www.magic3.org
15  */
16 require_once(M3_SYSTEM_INCLUDE_PATH . '/common/core.php');
17
18 class RequestManager extends Core
19 {
20         private $db;                                            // DBオブジェクト
21         private $tmpCookie;             // クッキー送信前のクッキー格納データ
22         private $magicQuote;    // バックスラッシュでの文字エスケープ処理
23         
24         /**
25          * コンストラクタ
26          */
27         function __construct()
28         {
29                 // 親クラスを呼び出す
30                 parent::__construct();
31                 
32                 // システムDBオブジェクト取得
33                 $this->db = $this->gInstance->getSytemDbObject();
34                 
35                 // セッションハンドラ設定
36                 // セッションDBが使用可能な場合は、ハンドラを設定し、
37                 // 使用不可の場合は、デフォルトのセッション管理を使用する
38                 if (M3_SESSION_DB && $this->gEnv->canUseDbSession()){
39                         ini_set('session.save_handler', 'user');                // 追加(2008/7/7)
40                         session_set_save_handler(       array($this, '_sessionOpen'),
41                                                                                 array($this, '_sessionClose'),
42                                                                                 array($this, '_sessionRead'),
43                                                                                 array($this, '_sessionWrite'),
44                                                                                 array($this, '_sessionDestroy'),
45                                                                                 array($this, '_sessionGc'));
46                 }
47                 
48                 // その他パラメータ初期化
49                 $this->tmpCookie = array();             // クッキー送信前のクッキー格納データ
50
51                 // magic quoteが有効の場合は回避手段を取る
52                 if (get_magic_quotes_gpc() == 1) $this->magicQuote = true;
53         }
54         /**
55          * POST値が設定されているか判断
56          */
57         public function isPost($name)
58         {
59                 return isset($_POST[$name]);
60         }
61         /**
62          * GET値が設定されているか判断
63          */
64         public function isGet($name)
65         {
66                 return isset($_GET[$name]);
67         }
68         /**
69          * POST値取得
70          */
71         public function valueOfPost($name)
72         {
73                 return self::isPost($name) ? $_POST[$name] : '';
74         }
75         /**
76          * POST値取得(トリミング(前後の空白削除)あり)
77          */
78         public function trimValueOfPost($name)
79         {
80                 $value = self::isPost($name) ? $_POST[$name] : '';
81                 return $this->_trimValueOf($name, $value);
82         }
83         /**
84          * GET値取得
85          */
86         public function valueOfGet($name)
87         {
88                 return self::isGet($name) ? $_GET[$name] : '';
89         }
90         /**
91          * GET値取得(トリミング(前後の空白削除)あり)
92          */
93         public function trimValueOfGet($name)
94         {
95                 $value = self::isGet($name) ? $_GET[$name] : '';
96                 return $this->_trimValueOf($name, $value);
97         }
98         /**
99          * POST,GETから値を取得
100          *
101          * POSTまたはGETから値を取得
102          *
103          * @param string $name          キー値
104          * @param string $default       値が存在しないときのデフォルト値
105          * @return string                       取得値
106          */
107         public function valueOf($name, $default = '')
108         {
109                 //return isset($_POST[$name]) ? $_POST[$name] : (isset($_GET[$name]) ? $_GET[$name] : $default);
110                 //return self::gpc_stripslashes(isset($_POST[$name]) ? $_POST[$name] : (isset($_GET[$name]) ? $_GET[$name] : $default));
111                 return $this->gpc_stripslashes(isset($_POST[$name]) ? $_POST[$name] : (isset($_GET[$name]) ? $_GET[$name] : $default));
112         }
113         /**
114          * POST,GETから値を取得(トリミング(前後の空白削除)あり)
115          *
116          * POSTまたはGETから値を取得し、トリミング(前後の空白削除)する
117          * デフォルトでHTMLタグを取り除く
118          *
119          * @param string $name          キー値
120          * @param string $default       値が存在しないときのデフォルト値
121          * @return string                       取得値
122          */
123         public function trimValueOf($name, $default = '')
124         {
125                 $srcValue = isset($_POST[$name]) ? $_POST[$name] : (isset($_GET[$name]) ? $_GET[$name] : $default);
126                 return $this->_trimValueOf($name, $srcValue, $default);
127         }
128         /**
129          * POST,GETから値をint値を取得(トリミング(前後の空白削除)あり)
130          *
131          * POSTまたはGETから値を取得し、トリミング(前後の空白削除)する
132          * デフォルトでHTMLタグを取り除く
133          *
134          * @param string $name          キー値
135          * @param string $default       値が存在しないときのデフォルト値
136          * @return string                       取得値
137          */
138         public function trimIntValueOf($name, $default = '')
139         {
140                 $srcValue = isset($_POST[$name]) ? $_POST[$name] : (isset($_GET[$name]) ? $_GET[$name] : $default);
141                 return $this->_trimValueOf($name, $srcValue, $default, 1/* int型チェック */);
142         }
143         /**
144          * トリミング(前後の空白削除)処理
145          *
146          * デフォルトでHTMLタグを取り除く
147          *
148          * @param string $name          キー値
149          * @param string $value         値
150          * @param string $default       値が存在しないときのデフォルト値
151          * @param int $ckeckType        値の型のチェックタイプ(0=型チェックなし、1=int型)
152          * @return string                       取得値
153          */
154         public function _trimValueOf($name, $value, $default='', $ckeckType=0)
155         {
156                 // トリムをかける
157                 if (is_array($value)){
158                         $trimValue = array_map('trim', $value);
159                         $destValue = array();
160                         foreach (array_keys($trimValue) as $key){
161                                 $stripValue = $this->gpc_stripslashes($trimValue[$key]);
162                                 $stripValue = strip_tags($stripValue);
163
164                                 // 危険性の高いその他変換。問題がある場合は文字列をクリアする
165                                 $saveValue = $stripValue;
166                                 $stripValue = $this->_convSafeText($stripValue);
167                                 if ($stripValue != $saveValue) $stripValue = '';
168
169                                 $isValid = false;
170                                 if (strlen($stripValue) == strlen($trimValue[$key])){           // 文字列長が同じとき
171                                         if ($ckeckType == 1){           // int型チェック
172                                                 if (is_numeric($stripValue) && !strstr($stripValue, '.')){
173                                                         $isValid = true;
174                                                 } else {        // エラーの場合は値を修正
175                                                         $stripValue = '';
176                                                 }
177                                         } else {
178                                                 $isValid = true;
179                                         }
180                                 }
181                                 
182                                 // エラーがある場合はログを残す
183                                 if (!$isValid){
184                                         // ウィジェット内での処理の場合はウィジェットIDも出力
185                                         $widgetId = $this->gEnv->getCurrentWidgetId();// ウィジェットID
186                                         if (empty($widgetId)){
187                                                 $this->gOpeLog->writeUserData(__METHOD__, 'POSTまたはGET値の異常データを検出しました。', 2010, 'name=' . $name . ', value=[' . $value[$key] . ']');
188                                         } else {                // ウィジェットIDが設定されているとき
189                                                 $this->gOpeLog->writeUserData(__METHOD__, 'POSTまたはGET値の異常データを検出しました。', 2011, 'name=' . $name . ', value=[' . $value[$key] . '], widgetid=' . $widgetId);
190                                         }
191                                 }
192                                 // 空のときはデフォルト値の設定
193                                 if ($stripValue == '') $stripValue = $default;
194                                 $destValue[] = $stripValue;
195                         }
196                 } else {
197                         $trimValue = trim($value);
198                         
199                         // HTMLタグが含まれていた場合は、ログを残す
200                         $destValue = $this->gpc_stripslashes($trimValue);
201                         $destValue = strip_tags($destValue);
202                         
203                         // 危険性の高いその他変換。問題がある場合は文字列をクリアする
204                         $saveValue = $destValue;
205                         $destValue = $this->_convSafeText($destValue);
206                         if ($destValue != $saveValue) $destValue = '';
207                         
208                         $isValid = false;
209                         if (strlen($destValue) == strlen($trimValue)){          // 文字列長が同じとき
210                                 if ($ckeckType == 1){           // int型チェック
211                                         if (is_numeric($destValue) && !strstr($destValue, '.')){
212                                                 $isValid = true;
213                                         } else {        // エラーの場合は値を修正
214                                                 $destValue = '';
215                                         }
216                                 } else {
217                                         $isValid = true;
218                                 }
219                         }
220                                 
221                         // エラーがある場合はログを残す
222                         if (!$isValid){
223                                 // ウィジェット内での処理の場合はウィジェットIDも出力
224                                 $widgetId = $this->gEnv->getCurrentWidgetId();// ウィジェットID
225                                 if (empty($widgetId)){
226                                         $this->gOpeLog->writeUserData(__METHOD__, 'POSTまたはGET値の異常データを検出しました。', 2012, 'name=' . $name . ', value=[' . $value . ']');
227                                 } else {                // ウィジェットIDが設定されているとき
228                                         $this->gOpeLog->writeUserData(__METHOD__, 'POSTまたはGET値の異常データを検出しました。', 2013, 'name=' . $name . ', value=[' . $value . '], widgetid=' . $widgetId);
229                                 }
230                         }
231                         // 空のときはデフォルト値の設定
232                         if ($destValue == '') $destValue = $default;
233                 }
234                 return $destValue;
235         }
236         /**
237          * 安全なテキストに変換
238          *
239          * @param string $src           変換するデータ
240          * @return string                       変換後データ
241          */
242         function _convSafeText($src)
243         {
244                 // マッチさせる文字列
245                 $search = array("':[\s]*?expression\('si",      // Javascriptが実行されないための対応「:expression(」「:url(」を削除(IE6,7用対応) 2009/1/15
246                                                 "':[\s]*?url\('si");
247
248                 // 変換文字列
249                 $replace = array("", "");
250
251                 return preg_replace($search, $replace, $src);
252         }
253         /**
254          * (携帯用)POST,GETから値を取得(トリミング(前後の空白削除)あり)
255          *
256          * POSTまたはGETから値を取得し、トリミング(前後の空白削除)する
257          * デフォルトでHTMLタグを取り除く
258          * 携帯用の文字コード変換を行う
259          *
260          * @param string $name          キー値
261          * @param string $default       値が存在しないときのデフォルト値
262          * @return string                       取得値
263          */
264         public function mobileTrimValueOf($name, $default = '')
265         {
266                 // 携帯用エンコーディングを取得
267                 $mobileEncoding = $this->gEnv->getMobileEncoding();
268                 
269                 // 入力データの文字コードをシステム内部コードに変換する
270                 $srcValue = $this->trimValueOf($name, $default);
271                 if (is_array($srcValue)){               // 配列の場合
272                         $destValue = array();
273                         if (function_exists('mb_convert_encoding')){
274                                 foreach (array_keys($srcValue) as $key){
275                                         $destValue[] = mb_convert_encoding($srcValue[$key], M3_ENCODING, $mobileEncoding);
276                                 }
277                         }
278                 } else {
279                         $destValue = '';
280                         if (function_exists('mb_convert_encoding')) $destValue = mb_convert_encoding($srcValue, M3_ENCODING, $mobileEncoding);
281                 }
282                 return $destValue;
283         }
284         /**
285          * 携帯用のテキストに変換
286          *
287          * @param string $srcStr        変換するデータ
288          * @return string                       変換後データ
289          */
290         function convMobileText($srcStr)
291         {
292                 // 携帯用エンコーディングを取得
293                 $mobileEncoding = $this->gEnv->getMobileEncoding();
294                 
295                 $destStr = '';
296                 if (function_exists('mb_convert_encoding')) $destStr = mb_convert_encoding($srcStr, $mobileEncoding, M3_ENCODING);
297                 return $destStr;
298         }
299         /**
300          * 取得メソッドがGETかどうか
301          *
302          * @return bool                 true=GETメソッド、false=GET以外
303          */
304         function isGetMethod()
305         {
306                 $method = strtoupper($this->trimServerValueOf('REQUEST_METHOD'));       // アクセスメソッド
307                 if ($method == 'GET'){
308                         return true;
309                 } else {
310                         return false;
311                 }
312         }
313         /**
314          * 取得メソッドがPOSTかどうか
315          *
316          * @return bool                 true=POSTメソッド、false=POST以外
317          */
318         function isPostMethod()
319         {
320                 $method = strtoupper($this->trimServerValueOf('REQUEST_METHOD'));       // アクセスメソッド
321                 if ($method == 'POST'){
322                         return true;
323                 } else {
324                         return false;
325                 }
326         }
327         /**
328          * $_SERVERから値を取得(トリミング(前後の空白削除)あり)
329          *
330          * $_SERVERから値を取得し、トリミング(前後の空白削除)する
331          *
332          * @param string $name          キー値
333          * @param string $default       値が存在しないときのデフォルト値
334          * @return string                       取得値
335          */
336         public function trimServerValueOf($name, $default = '')
337         {
338                 $value = isset($_SERVER[$name]) ? $_SERVER[$name] : $default;
339                 
340                 // トリムをかける
341                 if (is_array($value)){
342                         $value = array_map('trim', $value);
343                 } else {
344                         $value = trim($value);
345                 }
346                 return $value;
347         }
348         /**
349          * セッションから値を取得
350          *
351          * $_SESSIONから値を取得する。
352          *
353          * @param string $name          キー値
354          * @param string $default       値が存在しないときのデフォルト値
355          * @return string                       取得値
356          */
357         public function getSessionValue($name, $default = '')
358         {
359                 $value = isset($_SESSION[$name]) ? $_SESSION[$name] : $default;
360                 return $value;
361         }
362         /**
363          * セッションに値を格納
364          *
365          * $_SESSIONに値を格納する。
366          *
367          * @param string $name          キー値
368          * @param string $value         格納値
369          * @return                                      なし
370          */
371         public function setSessionValue($name, $value = '')
372         {
373                 $_SESSION[$name] = $value;
374         }
375         /**
376          * セッション格納値を開放
377          *
378          * $_SESSIONの指定値を開放する
379          *
380          * @param string $name          キー値
381          * @return                                      なし
382          */
383         public function unsetSessionValue($name)
384         {
385                 unset($_SESSION[$name]);
386         }
387         /**
388          * セッションからシリアライズされた値を取得
389          *
390          * @param string $name          キー値
391          * @return object                       取得したオブジェクト、なしの場合はnull
392          */
393         public function getSessionValueWithSerialize($name)
394         {
395                 $value = isset($_SESSION[$name]) ? unserialize($_SESSION[$name]) : null;
396                 return $value;
397         }
398         /**
399          * セッションに値をシリアライズして格納
400          *
401          * @param string $name          キー値
402          * @param object $value         格納するオブジェクト、nullをセットした場合はセッション値を削除
403          * @return                                      なし
404          */
405         public function setSessionValueWithSerialize($name, $value = null)
406         {
407                 if ($value == null){
408                         unset($_SESSION[$name]);
409                 } else {
410                         $_SESSION[$name] = serialize($value);
411                 }
412         }
413         /**
414          * クッキーから値を取得
415          *
416          * @param string $name          キー値
417          * @param string $default       値が存在しないときのデフォルト値
418          * @return string                       取得値
419          */
420         public function getCookieValue($name, $default = '')
421         {
422                 // 設定したクッキー値があれば取得
423                 $value = isset($this->tmpCookie[$name]) ? $this->tmpCookie[$name] : '';         // クッキー送信前のクッキー格納データ
424                 
425                 if ($value == '') $value = isset($_COOKIE[$name]) ? $_COOKIE[$name] : $default;
426                 return $value;
427         }
428         /**
429          * クッキーに値を格納
430          *
431          * @param string $name          キー値
432          * @param string $value         格納値
433          * @param int $expireDay        クッキーの生存期間(日)
434          * @return                                      なし
435          */
436         public function setCookieValue($name, $value = '', $expireDay = 30)
437         {
438                 $cookExpire = time() + 60 * 60 * 24 * $expireDay;
439                 setcookie($name, $value, $cookExpire);
440                 
441                 // 設定したクッキー値を保存
442                 $this->tmpCookie[$name] = $value;               // クッキー送信前のクッキー格納データ
443         }
444         /**
445          * URLクエリー配列を取得
446          *
447          * @return array                        URLクエリー文字列を解析した配列
448          */
449         public function getQueryArray()
450         {
451                 static $queryArray;
452                 
453                 if (!isset($queryArray)){
454                         $queryArray = array();
455                         $queryStr = self::trimServerValueOf('QUERY_STRING');
456                         if (!empty($queryStr)){
457                                 parse_str($queryStr, $queryArray);
458                                 // パラメータのエラーチェック
459                         }
460                 }
461                 return $queryArray;
462         }
463         /**
464          * クエリー文字列中のWikiページ名を取得
465          *
466          * @return string                       Wikiページ名、空の時はWikiページ名なし
467          */
468         public function getWikiPageFromQuery()
469         {
470                 $wikiPage = '';
471                 $args = explode('&', $_SERVER['QUERY_STRING']);// 「&」で分割
472                 for ($i = 0; $i < count($args); $i++){
473                         $line = $args[$i];
474                         $pos = strpos($line, '=');
475                         if ($pos){              // 「=」が存在するとき
476                                 //list($key, $value) = explode('=', $line);
477                         } else {
478                                 $wikiPage = $line;              // 「=」なしのパラメータはwikiパラメータとする
479                                 break;
480                         }
481                 }
482                 return $wikiPage;
483         }
484         /**
485          * 文字のエスケープ処理
486          *
487          * '(シングルクオート)、" (ダブルクオート)、\(バックスラッシュ) 、NULLにバックスラッシュでエスケープ処理を行う
488          *
489          * @param string $str           変換元文字列
490          * @return string                       変換後文字列
491          */
492 /*      function gpc_addslashes($str){
493                 if ($this->magicQuote){
494                         return $str;
495                 } else {
496                         return addslashes($str);
497                 }
498         }*/
499         /**
500          * 文字のエスケープ処理をはずす
501          *
502          * '(シングルクオート)、" (ダブルクオート)、\(バックスラッシュ) 、NULLのバックスラッシュでのエスケープ処理を削除
503          *
504          * @param string $str           変換元文字列
505          * @return string                       変換後文字列
506          */
507         function gpc_stripslashes($str){
508                 if ($this->magicQuote){  
509                         return stripslashes($str);
510                 } else {  
511                         return $str;  
512                 }  
513         }
514         //******************************************************
515         // patTemplateのテンプレートに値を埋め込む。値を省略した場合は、POST,GETデータから取得したデータを再設定する。
516         // $name: patTemplateのテンプレート名
517         // $valueName: HTMLタグに設定した名前。patTemplateの値埋め込み用キーワードも同じものを使用する。
518         // $default: 値埋め込み用キーワードに埋め込む値。省略の場合はPOST,GETデータから$valueNameの値を取得する。
519         function addValueToTemplate($name, $valueName, $default = null)
520         {
521                 if ($default == null){
522                         $this->tmpl->addVar($name, $valueName, $this->valueOf($valueName));
523                 } else {
524                         $this->tmpl->addVar($name, $valueName, $default);
525                 }
526         }
527         /**
528          * セッションを開く
529          */
530         function _sessionOpen($save_path, $session_name)
531         {
532                 return true;
533         }
534         /**
535          * セッションを閉じる
536          */
537         function _sessionClose()
538         {
539                 return true;
540         }
541         /**
542          * セッションデータを読み込む
543          */
544         function _sessionRead($id)
545         {
546                 return $this->db->readSession($id);
547         }
548         /**
549          * セッションデータを書き込む
550          *
551          * @param string $id                    セッションID
552          * @param string $sessData      セッションデータ
553          */
554         function _sessionWrite($id, $sessData)
555         {
556                 return $this->db->writeSession($id, $sessData);
557         }
558         /**
559          * セッションを破棄する
560          *
561          * @param string $id                    セッションID
562          */
563         function _sessionDestroy($id)
564         {
565                 return $this->db->destroySession($id);
566         }
567         /**
568          * 時間経過したセッションを破棄する
569          *
570          * @param int $maxlifetime      セッションの生存時間(秒)
571          */
572         function _sessionGc($maxlifetime)
573         {
574                 return $this->db->gcSession($maxlifetime);
575         }
576 }
577 ?>