3 * HTTPリクエスト、レスポンス、セッション管理マネージャー
7 * LICENSE: This source file is licensed under the terms of the GNU General Public License.
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
14 * @link http://www.magic3.org
16 require_once(M3_SYSTEM_INCLUDE_PATH . '/common/core.php');
18 class RequestManager extends Core
20 private $db; // DBオブジェクト
21 private $tmpCookie; // クッキー送信前のクッキー格納データ
22 private $magicQuote; // バックスラッシュでの文字エスケープ処理
27 function __construct()
30 parent::__construct();
33 $this->db = $this->gInstance->getSytemDbObject();
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'));
49 $this->tmpCookie = array(); // クッキー送信前のクッキー格納データ
51 // magic quoteが有効の場合は回避手段を取る
52 if (get_magic_quotes_gpc() == 1) $this->magicQuote = true;
57 public function isPost($name)
59 return isset($_POST[$name]);
64 public function isGet($name)
66 return isset($_GET[$name]);
71 public function valueOfPost($name)
73 return self::isPost($name) ? $_POST[$name] : '';
76 * POST値取得(トリミング(前後の空白削除)あり)
78 public function trimValueOfPost($name)
80 $value = self::isPost($name) ? $_POST[$name] : '';
81 return $this->_trimValueOf($name, $value);
86 public function valueOfGet($name)
88 return self::isGet($name) ? $_GET[$name] : '';
91 * GET値取得(トリミング(前後の空白削除)あり)
93 public function trimValueOfGet($name)
95 $value = self::isGet($name) ? $_GET[$name] : '';
96 return $this->_trimValueOf($name, $value);
103 * @param string $name キー値
104 * @param string $default 値が存在しないときのデフォルト値
107 public function valueOf($name, $default = '')
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));
114 * POST,GETから値を取得(トリミング(前後の空白削除)あり)
116 * POSTまたはGETから値を取得し、トリミング(前後の空白削除)する
119 * @param string $name キー値
120 * @param string $default 値が存在しないときのデフォルト値
123 public function trimValueOf($name, $default = '')
125 $srcValue = isset($_POST[$name]) ? $_POST[$name] : (isset($_GET[$name]) ? $_GET[$name] : $default);
126 return $this->_trimValueOf($name, $srcValue, $default);
129 * POST,GETから値をint値を取得(トリミング(前後の空白削除)あり)
131 * POSTまたはGETから値を取得し、トリミング(前後の空白削除)する
134 * @param string $name キー値
135 * @param string $default 値が存在しないとき、値が空文字列のときのデフォルト値
138 //public function trimIntValueOf($name, $default = '')
139 public function trimIntValueOf($name, $default) // デフォルト値必須(2015/2/13)
141 $srcValue = isset($_POST[$name]) ? $_POST[$name] : (isset($_GET[$name]) ? $_GET[$name] : $default);
142 return $this->_trimValueOf($name, $srcValue, $default, 1/* int型チェック */);
145 * POST,GETから値をチェックボックスの値を取得(トリミング(前後の空白削除)あり)
147 * POSTまたはGETから値を取得し、トリミング(前後の空白削除)する
150 * @param string $name キー値
151 * @param string $default 値が存在しないときのデフォルト値
152 * @return string 取得値(0または1)
154 public function trimCheckedValueOf($name, $default = '')
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';
163 * デフォルトで不正な文字(HTMLタグ等)を取り除く
165 * @param string $name キー値
166 * @param string $value 値
167 * @param string $default 値が存在しないときのデフォルト値
168 * @param int $ckeckType 値の型のチェックタイプ(0=型チェックなし、1=int型)
171 public function _trimValueOf($name, $value, $default='', $ckeckType=0)
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);
181 // 危険性の高いその他変換。問題がある場合は文字列をクリアする
182 $saveValue = $stripValue;
183 $stripValue = $this->_convSafeText($stripValue);
184 if ($stripValue != $saveValue) $stripValue = '';
187 if (strlen($stripValue) == strlen($trimValue[$key])){ // 文字列長が同じとき
188 if ($ckeckType == 1){ // int型チェック
189 if ($stripValue == ''){ // 空文字列の場合はエラーと見なさない(2015/2/19 追加)
191 } else if (is_numeric($stripValue) && !strstr($stripValue, '.')){
193 } else { // エラーの場合は値を修正
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);
212 if ($stripValue == '') $stripValue = $default;
213 $destValue[] = $stripValue;
216 $trimValue = trim($value);
218 // HTMLタグが含まれていた場合は、ログを残す
219 $destValue = $this->gpc_stripslashes($trimValue);
220 $destValue = strip_tags($destValue);
222 // 危険性の高いその他変換。問題がある場合は文字列をクリアする
223 $saveValue = $destValue;
224 $destValue = $this->_convSafeText($destValue);
225 if ($destValue != $saveValue) $destValue = '';
228 if (strlen($destValue) == strlen($trimValue)){ // 文字列長が同じとき
229 if ($ckeckType == 1){ // int型チェック
230 if ($destValue == ''){ // 空文字列の場合はエラーと見なさない(2015/2/19 追加)
232 } else if (is_numeric($destValue) && !strstr($destValue, '.')){
234 } else { // エラーの場合は値を修正
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);
253 if ($destValue == '') $destValue = $default;
260 * @param string $src 変換するデータ
261 * @return string 変換後データ
263 function _convSafeText($src)
266 $search = array("':[\s]*?expression\('si", // Javascriptが実行されないための対応「:expression(」「:url(」を削除(IE6,7用対応) 2009/1/15
270 $replace = array("", "");
272 return preg_replace($search, $replace, $src);
275 * (携帯用)POST,GETから値を取得(トリミング(前後の空白削除)あり)
277 * POSTまたはGETから値を取得し、トリミング(前後の空白削除)する
281 * @param string $name キー値
282 * @param string $default 値が存在しないときのデフォルト値
285 public function mobileTrimValueOf($name, $default = '')
288 $mobileEncoding = $this->gEnv->getMobileEncoding();
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);
301 if (function_exists('mb_convert_encoding')) $destValue = mb_convert_encoding($srcValue, M3_ENCODING, $mobileEncoding);
308 * @param string $srcStr 変換するデータ
309 * @return string 変換後データ
311 function convMobileText($srcStr)
314 $mobileEncoding = $this->gEnv->getMobileEncoding();
317 if (function_exists('mb_convert_encoding')) $destStr = mb_convert_encoding($srcStr, $mobileEncoding, M3_ENCODING);
323 * @return bool true=GETメソッド、false=GET以外
325 function isGetMethod()
327 $method = strtoupper($this->trimServerValueOf('REQUEST_METHOD')); // アクセスメソッド
328 if ($method == 'GET'){
337 * @return bool true=POSTメソッド、false=POST以外
339 function isPostMethod()
341 $method = strtoupper($this->trimServerValueOf('REQUEST_METHOD')); // アクセスメソッド
342 if ($method == 'POST'){
349 * $_SERVERから値を取得(トリミング(前後の空白削除)あり)
351 * $_SERVERから値を取得し、トリミング(前後の空白削除)する
353 * @param string $name キー値
354 * @param string $default 値が存在しないときのデフォルト値
357 public function trimServerValueOf($name, $default = '')
359 $value = isset($_SERVER[$name]) ? $_SERVER[$name] : $default;
362 if (is_array($value)){
363 $value = array_map('trim', $value);
365 $value = trim($value);
374 * @param string $name キー値
375 * @param string $default 値が存在しないときのデフォルト値
378 public function getSessionValue($name, $default = '')
380 $value = isset($_SESSION[$name]) ? $_SESSION[$name] : $default;
388 * @param string $name キー値
389 * @param string $value 格納値
392 public function setSessionValue($name, $value = '')
394 $_SESSION[$name] = $value;
401 * @param string $name キー値
404 public function unsetSessionValue($name)
406 unset($_SESSION[$name]);
409 * セッションからシリアライズされた値を取得
411 * @param string $name キー値
412 * @return object 取得したオブジェクト、なしの場合はnull
414 public function getSessionValueWithSerialize($name)
416 $value = isset($_SESSION[$name]) ? unserialize($_SESSION[$name]) : null;
422 * @param string $name キー値
423 * @param object $value 格納するオブジェクト、nullをセットした場合はセッション値を削除
426 public function setSessionValueWithSerialize($name, $value = null)
429 unset($_SESSION[$name]);
431 $_SESSION[$name] = serialize($value);
437 * @param string $name キー値
438 * @param string $default 値が存在しないときのデフォルト値
441 public function getCookieValue($name, $default = '')
444 $value = isset($this->tmpCookie[$name]) ? $this->tmpCookie[$name] : ''; // クッキー送信前のクッキー格納データ
446 if ($value == '') $value = isset($_COOKIE[$name]) ? $_COOKIE[$name] : $default;
452 * @param string $name キー値
453 * @param string $value 格納値
454 * @param int $expireDay クッキーの生存期間(日)
457 public function setCookieValue($name, $value = '', $expireDay = 30)
459 $cookExpire = time() + 60 * 60 * 24 * $expireDay;
460 //setcookie($name, $value, $cookExpire);
461 setcookie($name, $value, $cookExpire, '/');
464 $this->tmpCookie[$name] = $value; // クッキー送信前のクッキー格納データ
469 * @param string $name キー値
472 public function removeCookieValue($name)
474 setcookie($name, '', time() - 3600, '/');
475 //setcookie($name, '', time() - 3600, '/');
480 * @return array URLクエリー文字列を解析した配列
482 public function getQueryArray()
486 if (!isset($queryArray)){
487 $queryArray = array();
488 $queryStr = self::trimServerValueOf('QUERY_STRING');
489 if (!empty($queryStr)){
490 parse_str($queryStr, $queryArray);
497 * クエリー文字列中のWikiページ名を取得
499 * @return string Wikiページ名、空の時はWikiページ名なし
501 public function getWikiPageFromQuery()
504 $args = explode('&', $_SERVER['QUERY_STRING']);// 「&」で分割
505 for ($i = 0; $i < count($args); $i++){
507 $pos = strpos($line, '=');
508 if ($pos){ // 「=」が存在するとき
509 //list($key, $value) = explode('=', $line);
511 $wikiPage = $line; // 「=」なしのパラメータはwikiパラメータとする
520 * '(シングルクオート)、" (ダブルクオート)、\(バックスラッシュ) 、NULLにバックスラッシュでエスケープ処理を行う
522 * @param string $str 変換元文字列
523 * @return string 変換後文字列
525 /* function gpc_addslashes($str){
526 if ($this->magicQuote){
529 return addslashes($str);
535 * '(シングルクオート)、" (ダブルクオート)、\(バックスラッシュ) 、NULLのバックスラッシュでのエスケープ処理を削除
537 * @param string $str 変換元文字列
538 * @return string 変換後文字列
540 function gpc_stripslashes($str){
541 if ($this->magicQuote){
542 return stripslashes($str);
547 //******************************************************
548 // patTemplateのテンプレートに値を埋め込む。値を省略した場合は、POST,GETデータから取得したデータを再設定する。
549 // $name: patTemplateのテンプレート名
550 // $valueName: HTMLタグに設定した名前。patTemplateの値埋め込み用キーワードも同じものを使用する。
551 // $default: 値埋め込み用キーワードに埋め込む値。省略の場合はPOST,GETデータから$valueNameの値を取得する。
552 function addValueToTemplate($name, $valueName, $default = null)
554 if ($default == null){
555 $this->tmpl->addVar($name, $valueName, $this->valueOf($valueName));
557 $this->tmpl->addVar($name, $valueName, $default);
563 function _sessionOpen($save_path, $session_name)
570 function _sessionClose()
577 function _sessionRead($id)
579 return $this->db->readSession($id);
584 * @param string $id セッションID
585 * @param string $sessData セッションデータ
587 function _sessionWrite($id, $sessData)
589 return $this->db->writeSession($id, $sessData);
594 * @param string $id セッションID
596 function _sessionDestroy($id)
598 return $this->db->destroySession($id);
603 * @param int $maxlifetime セッションの生存時間(秒)
605 function _sessionGc($maxlifetime)
607 return $this->db->gcSession($maxlifetime);