OSDN Git Service

int型の入力値チェックを修正。
[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-2015 Magic3 Project.
12  * @license    http://www.gnu.org/copyleft/gpl.html  GPL License
13  * @version    SVN: $Id$
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         public function trimIntValueOf($name, $default)                 // デフォルト値必須(2015/2/13)
140         {
141                 $srcValue = isset($_POST[$name]) ? $_POST[$name] : (isset($_GET[$name]) ? $_GET[$name] : $default);
142                 return $this->_trimValueOf($name, $srcValue, $default, 1/* int型チェック */);
143         }
144         /**
145          * POST,GETから値をチェックボックスの値を取得(トリミング(前後の空白削除)あり)
146          *
147          * POSTまたはGETから値を取得し、トリミング(前後の空白削除)する
148          * デフォルトでHTMLタグを取り除く
149          *
150          * @param string $name          キー値
151          * @param string $default       値が存在しないときのデフォルト値
152          * @return string                       取得値(0または1)
153          */
154         public function trimCheckedValueOf($name, $default = '')
155         {
156                 $srcValue = isset($_POST[$name]) ? $_POST[$name] : (isset($_GET[$name]) ? $_GET[$name] : $default);
157                 $checked = $this->_trimValueOf($name, $srcValue, $default);
158                 return ($checked == 'on') ? '1' : '0';
159         }
160         /**
161          * トリミング(前後の空白削除)処理
162          *
163          * デフォルトで不正な文字(HTMLタグ等)を取り除く
164          *
165          * @param string $name          キー値
166          * @param string $value         値
167          * @param string $default       値が存在しないときのデフォルト値
168          * @param int $ckeckType        値の型のチェックタイプ(0=型チェックなし、1=int型)
169          * @return string                       取得値
170          */
171         public function _trimValueOf($name, $value, $default='', $ckeckType=0)
172         {
173                 // トリムをかける
174                 if (is_array($value)){
175                         $trimValue = array_map('trim', $value);
176                         $destValue = array();
177                         foreach (array_keys($trimValue) as $key){
178                                 $stripValue = $this->gpc_stripslashes($trimValue[$key]);
179                                 $stripValue = strip_tags($stripValue);
180
181                                 // 危険性の高いその他変換。問題がある場合は文字列をクリアする
182                                 $saveValue = $stripValue;
183                                 $stripValue = $this->_convSafeText($stripValue);
184                                 if ($stripValue != $saveValue) $stripValue = '';
185
186                                 $isValid = false;
187                                 if (strlen($stripValue) == strlen($trimValue[$key])){           // 文字列長が同じとき
188                                         if ($ckeckType == 1){           // int型チェック
189                                                 if ($stripValue == ''){                         // 空文字列の場合はエラーと見なさない(2015/2/19 追加)
190                                                         $isValid = true;
191                                                 } else if (is_numeric($stripValue) && !strstr($stripValue, '.')){
192                                                         $isValid = true;
193                                                 } else {        // エラーの場合は値を修正
194                                                         $stripValue = '';
195                                                 }
196                                         } else {
197                                                 $isValid = true;
198                                         }
199                                 }
200                                 
201                                 // エラーがある場合はログを残す
202                                 if (!$isValid){
203                                         // ウィジェット内での処理の場合はウィジェットIDも出力
204                                         $widgetId = $this->gEnv->getCurrentWidgetId();// ウィジェットID
205                                         if (empty($widgetId)){
206                                                 $this->gOpeLog->writeUserData(__METHOD__, 'POSTまたはGET値の異常データを検出しました。', 2010, 'name=' . $name . ', value=[' . $value[$key] . ']');
207                                         } else {                // ウィジェットIDが設定されているとき
208                                                 $this->gOpeLog->writeUserData(__METHOD__, 'POSTまたはGET値の異常データを検出しました。', 2011, 'name=' . $name . ', value=[' . $value[$key] . '], widgetid=' . $widgetId);
209                                         }
210                                 }
211                                 // 空のときはデフォルト値の設定
212                                 if ($stripValue == '') $stripValue = $default;
213                                 $destValue[] = $stripValue;
214                         }
215                 } else {
216                         $trimValue = trim($value);
217                         
218                         // HTMLタグが含まれていた場合は、ログを残す
219                         $destValue = $this->gpc_stripslashes($trimValue);
220                         $destValue = strip_tags($destValue);
221                         
222                         // 危険性の高いその他変換。問題がある場合は文字列をクリアする
223                         $saveValue = $destValue;
224                         $destValue = $this->_convSafeText($destValue);
225                         if ($destValue != $saveValue) $destValue = '';
226
227                         $isValid = false;
228                         if (strlen($destValue) == strlen($trimValue)){          // 文字列長が同じとき
229                                 if ($ckeckType == 1){           // int型チェック
230                                         if ($destValue == ''){                          // 空文字列の場合はエラーと見なさない(2015/2/19 追加)
231                                                 $isValid = true;
232                                         } else if (is_numeric($destValue) && !strstr($destValue, '.')){
233                                                 $isValid = true;
234                                         } else {        // エラーの場合は値を修正
235                                                 $destValue = '';
236                                         }
237                                 } else {
238                                         $isValid = true;
239                                 }
240                         }
241                                 
242                         // エラーがある場合はログを残す
243                         if (!$isValid){
244                                 // ウィジェット内での処理の場合はウィジェットIDも出力
245                                 $widgetId = $this->gEnv->getCurrentWidgetId();// ウィジェットID
246                                 if (empty($widgetId)){
247                                         $this->gOpeLog->writeUserData(__METHOD__, 'POSTまたはGET値の異常データを検出しました。', 2012, 'name=' . $name . ', value=[' . $value . ']');
248                                 } else {                // ウィジェットIDが設定されているとき
249                                         $this->gOpeLog->writeUserData(__METHOD__, 'POSTまたはGET値の異常データを検出しました。', 2013, 'name=' . $name . ', value=[' . $value . '], widgetid=' . $widgetId);
250                                 }
251                         }
252                         // 空のときはデフォルト値の設定
253                         if ($destValue == '') $destValue = $default;
254                 }
255                 return $destValue;
256         }
257         /**
258          * 安全なテキストに変換
259          *
260          * @param string $src           変換するデータ
261          * @return string                       変換後データ
262          */
263         function _convSafeText($src)
264         {
265                 // マッチさせる文字列
266                 $search = array("':[\s]*?expression\('si",      // Javascriptが実行されないための対応「:expression(」「:url(」を削除(IE6,7用対応) 2009/1/15
267                                                 "':[\s]*?url\('si");
268
269                 // 変換文字列
270                 $replace = array("", "");
271
272                 return preg_replace($search, $replace, $src);
273         }
274         /**
275          * (携帯用)POST,GETから値を取得(トリミング(前後の空白削除)あり)
276          *
277          * POSTまたはGETから値を取得し、トリミング(前後の空白削除)する
278          * デフォルトでHTMLタグを取り除く
279          * 携帯用の文字コード変換を行う
280          *
281          * @param string $name          キー値
282          * @param string $default       値が存在しないときのデフォルト値
283          * @return string                       取得値
284          */
285         public function mobileTrimValueOf($name, $default = '')
286         {
287                 // 携帯用エンコーディングを取得
288                 $mobileEncoding = $this->gEnv->getMobileEncoding();
289                 
290                 // 入力データの文字コードをシステム内部コードに変換する
291                 $srcValue = $this->trimValueOf($name, $default);
292                 if (is_array($srcValue)){               // 配列の場合
293                         $destValue = array();
294                         if (function_exists('mb_convert_encoding')){
295                                 foreach (array_keys($srcValue) as $key){
296                                         $destValue[] = mb_convert_encoding($srcValue[$key], M3_ENCODING, $mobileEncoding);
297                                 }
298                         }
299                 } else {
300                         $destValue = '';
301                         if (function_exists('mb_convert_encoding')) $destValue = mb_convert_encoding($srcValue, M3_ENCODING, $mobileEncoding);
302                 }
303                 return $destValue;
304         }
305         /**
306          * 携帯用のテキストに変換
307          *
308          * @param string $srcStr        変換するデータ
309          * @return string                       変換後データ
310          */
311         function convMobileText($srcStr)
312         {
313                 // 携帯用エンコーディングを取得
314                 $mobileEncoding = $this->gEnv->getMobileEncoding();
315                 
316                 $destStr = '';
317                 if (function_exists('mb_convert_encoding')) $destStr = mb_convert_encoding($srcStr, $mobileEncoding, M3_ENCODING);
318                 return $destStr;
319         }
320         /**
321          * 取得メソッドがGETかどうか
322          *
323          * @return bool                 true=GETメソッド、false=GET以外
324          */
325         function isGetMethod()
326         {
327                 $method = strtoupper($this->trimServerValueOf('REQUEST_METHOD'));       // アクセスメソッド
328                 if ($method == 'GET'){
329                         return true;
330                 } else {
331                         return false;
332                 }
333         }
334         /**
335          * 取得メソッドがPOSTかどうか
336          *
337          * @return bool                 true=POSTメソッド、false=POST以外
338          */
339         function isPostMethod()
340         {
341                 $method = strtoupper($this->trimServerValueOf('REQUEST_METHOD'));       // アクセスメソッド
342                 if ($method == 'POST'){
343                         return true;
344                 } else {
345                         return false;
346                 }
347         }
348         /**
349          * $_SERVERから値を取得(トリミング(前後の空白削除)あり)
350          *
351          * $_SERVERから値を取得し、トリミング(前後の空白削除)する
352          *
353          * @param string $name          キー値
354          * @param string $default       値が存在しないときのデフォルト値
355          * @return string                       取得値
356          */
357         public function trimServerValueOf($name, $default = '')
358         {
359                 $value = isset($_SERVER[$name]) ? $_SERVER[$name] : $default;
360                 
361                 // トリムをかける
362                 if (is_array($value)){
363                         $value = array_map('trim', $value);
364                 } else {
365                         $value = trim($value);
366                 }
367                 return $value;
368         }
369         /**
370          * セッションから値を取得
371          *
372          * $_SESSIONから値を取得する。
373          *
374          * @param string $name          キー値
375          * @param string $default       値が存在しないときのデフォルト値
376          * @return string                       取得値
377          */
378         public function getSessionValue($name, $default = '')
379         {
380                 $value = isset($_SESSION[$name]) ? $_SESSION[$name] : $default;
381                 return $value;
382         }
383         /**
384          * セッションに値を格納
385          *
386          * $_SESSIONに値を格納する。
387          *
388          * @param string $name          キー値
389          * @param string $value         格納値
390          * @return                                      なし
391          */
392         public function setSessionValue($name, $value = '')
393         {
394                 $_SESSION[$name] = $value;
395         }
396         /**
397          * セッション格納値を開放
398          *
399          * $_SESSIONの指定値を開放する
400          *
401          * @param string $name          キー値
402          * @return                                      なし
403          */
404         public function unsetSessionValue($name)
405         {
406                 unset($_SESSION[$name]);
407         }
408         /**
409          * セッションからシリアライズされた値を取得
410          *
411          * @param string $name          キー値
412          * @return object                       取得したオブジェクト、なしの場合はnull
413          */
414         public function getSessionValueWithSerialize($name)
415         {
416                 $value = isset($_SESSION[$name]) ? unserialize($_SESSION[$name]) : null;
417                 return $value;
418         }
419         /**
420          * セッションに値をシリアライズして格納
421          *
422          * @param string $name          キー値
423          * @param object $value         格納するオブジェクト、nullをセットした場合はセッション値を削除
424          * @return                                      なし
425          */
426         public function setSessionValueWithSerialize($name, $value = null)
427         {
428                 if ($value == null){
429                         unset($_SESSION[$name]);
430                 } else {
431                         $_SESSION[$name] = serialize($value);
432                 }
433         }
434         /**
435          * クッキーから値を取得
436          *
437          * @param string $name          キー値
438          * @param string $default       値が存在しないときのデフォルト値
439          * @return string                       取得値
440          */
441         public function getCookieValue($name, $default = '')
442         {
443                 // 設定したクッキー値があれば取得
444                 $value = isset($this->tmpCookie[$name]) ? $this->tmpCookie[$name] : '';         // クッキー送信前のクッキー格納データ
445
446                 if ($value == '') $value = isset($_COOKIE[$name]) ? $_COOKIE[$name] : $default;
447                 return $value;
448         }
449         /**
450          * クッキーに値を格納
451          *
452          * @param string $name          キー値
453          * @param string $value         格納値
454          * @param int $expireDay        クッキーの生存期間(日)
455          * @return                                      なし
456          */
457         public function setCookieValue($name, $value = '', $expireDay = 30)
458         {
459                 $cookExpire = time() + 60 * 60 * 24 * $expireDay;
460                 //setcookie($name, $value, $cookExpire);
461                 setcookie($name, $value, $cookExpire, '/');
462                 
463                 // 設定したクッキー値を保存
464                 $this->tmpCookie[$name] = $value;               // クッキー送信前のクッキー格納データ
465         }
466         /**
467          * クッキーに値を削除
468          *
469          * @param string $name          キー値
470          * @return                                      なし
471          */
472         public function removeCookieValue($name)
473         {
474                 setcookie($name, '', time() - 3600, '/');
475                 //setcookie($name, '', time() - 3600, '/');
476         }
477         /**
478          * URLクエリー配列を取得
479          *
480          * @return array                        URLクエリー文字列を解析した配列
481          */
482         public function getQueryArray()
483         {
484                 static $queryArray;
485                 
486                 if (!isset($queryArray)){
487                         $queryArray = array();
488                         $queryStr = self::trimServerValueOf('QUERY_STRING');
489                         if (!empty($queryStr)){
490                                 parse_str($queryStr, $queryArray);
491                                 // パラメータのエラーチェック
492                         }
493                 }
494                 return $queryArray;
495         }
496         /**
497          * クエリー文字列中のWikiページ名を取得
498          *
499          * @return string                       Wikiページ名、空の時はWikiページ名なし
500          */
501         public function getWikiPageFromQuery()
502         {
503                 $wikiPage = '';
504                 $args = explode('&', $_SERVER['QUERY_STRING']);// 「&」で分割
505                 for ($i = 0; $i < count($args); $i++){
506                         $line = $args[$i];
507                         $pos = strpos($line, '=');
508                         if ($pos){              // 「=」が存在するとき
509                                 //list($key, $value) = explode('=', $line);
510                         } else {
511                                 $wikiPage = $line;              // 「=」なしのパラメータはwikiパラメータとする
512                                 break;
513                         }
514                 }
515                 return $wikiPage;
516         }
517         /**
518          * 文字のエスケープ処理
519          *
520          * '(シングルクオート)、" (ダブルクオート)、\(バックスラッシュ) 、NULLにバックスラッシュでエスケープ処理を行う
521          *
522          * @param string $str           変換元文字列
523          * @return string                       変換後文字列
524          */
525 /*      function gpc_addslashes($str){
526                 if ($this->magicQuote){
527                         return $str;
528                 } else {
529                         return addslashes($str);
530                 }
531         }*/
532         /**
533          * 文字のエスケープ処理をはずす
534          *
535          * '(シングルクオート)、" (ダブルクオート)、\(バックスラッシュ) 、NULLのバックスラッシュでのエスケープ処理を削除
536          *
537          * @param string $str           変換元文字列
538          * @return string                       変換後文字列
539          */
540         function gpc_stripslashes($str){
541                 if ($this->magicQuote){  
542                         return stripslashes($str);
543                 } else {  
544                         return $str;  
545                 }  
546         }
547         //******************************************************
548         // patTemplateのテンプレートに値を埋め込む。値を省略した場合は、POST,GETデータから取得したデータを再設定する。
549         // $name: patTemplateのテンプレート名
550         // $valueName: HTMLタグに設定した名前。patTemplateの値埋め込み用キーワードも同じものを使用する。
551         // $default: 値埋め込み用キーワードに埋め込む値。省略の場合はPOST,GETデータから$valueNameの値を取得する。
552         function addValueToTemplate($name, $valueName, $default = null)
553         {
554                 if ($default == null){
555                         $this->tmpl->addVar($name, $valueName, $this->valueOf($valueName));
556                 } else {
557                         $this->tmpl->addVar($name, $valueName, $default);
558                 }
559         }
560         /**
561          * セッションを開く
562          */
563         function _sessionOpen($save_path, $session_name)
564         {
565                 return true;
566         }
567         /**
568          * セッションを閉じる
569          */
570         function _sessionClose()
571         {
572                 return true;
573         }
574         /**
575          * セッションデータを読み込む
576          */
577         function _sessionRead($id)
578         {
579                 return $this->db->readSession($id);
580         }
581         /**
582          * セッションデータを書き込む
583          *
584          * @param string $id                    セッションID
585          * @param string $sessData      セッションデータ
586          */
587         function _sessionWrite($id, $sessData)
588         {
589                 return $this->db->writeSession($id, $sessData);
590         }
591         /**
592          * セッションを破棄する
593          *
594          * @param string $id                    セッションID
595          */
596         function _sessionDestroy($id)
597         {
598                 return $this->db->destroySession($id);
599         }
600         /**
601          * 時間経過したセッションを破棄する
602          *
603          * @param int $maxlifetime      セッションの生存時間(秒)
604          */
605         function _sessionGc($maxlifetime)
606         {
607                 return $this->db->gcSession($maxlifetime);
608         }
609 }
610 ?>