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-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
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 = '')
140 $srcValue = isset($_POST[$name]) ? $_POST[$name] : (isset($_GET[$name]) ? $_GET[$name] : $default);
141 return $this->_trimValueOf($name, $srcValue, $default, 1/* int型チェック */);
148 * @param string $name キー値
149 * @param string $value 値
150 * @param string $default 値が存在しないときのデフォルト値
151 * @param int $ckeckType 値の型のチェックタイプ(0=型チェックなし、1=int型)
154 public function _trimValueOf($name, $value, $default='', $ckeckType=0)
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);
164 // 危険性の高いその他変換。問題がある場合は文字列をクリアする
165 $saveValue = $stripValue;
166 $stripValue = $this->_convSafeText($stripValue);
167 if ($stripValue != $saveValue) $stripValue = '';
170 if (strlen($stripValue) == strlen($trimValue[$key])){ // 文字列長が同じとき
171 if ($ckeckType == 1){ // int型チェック
172 if (is_numeric($stripValue) && !strstr($stripValue, '.')){
174 } else { // エラーの場合は値を修正
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);
193 if ($stripValue == '') $stripValue = $default;
194 $destValue[] = $stripValue;
197 $trimValue = trim($value);
199 // HTMLタグが含まれていた場合は、ログを残す
200 $destValue = $this->gpc_stripslashes($trimValue);
201 $destValue = strip_tags($destValue);
203 // 危険性の高いその他変換。問題がある場合は文字列をクリアする
204 $saveValue = $destValue;
205 $destValue = $this->_convSafeText($destValue);
206 if ($destValue != $saveValue) $destValue = '';
209 if (strlen($destValue) == strlen($trimValue)){ // 文字列長が同じとき
210 if ($ckeckType == 1){ // int型チェック
211 if (is_numeric($destValue) && !strstr($destValue, '.')){
213 } else { // エラーの場合は値を修正
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);
232 if ($destValue == '') $destValue = $default;
239 * @param string $src 変換するデータ
240 * @return string 変換後データ
242 function _convSafeText($src)
245 $search = array("':[\s]*?expression\('si", // Javascriptが実行されないための対応「:expression(」「:url(」を削除(IE6,7用対応) 2009/1/15
249 $replace = array("", "");
251 return preg_replace($search, $replace, $src);
254 * (携帯用)POST,GETから値を取得(トリミング(前後の空白削除)あり)
256 * POSTまたはGETから値を取得し、トリミング(前後の空白削除)する
260 * @param string $name キー値
261 * @param string $default 値が存在しないときのデフォルト値
264 public function mobileTrimValueOf($name, $default = '')
267 $mobileEncoding = $this->gEnv->getMobileEncoding();
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);
280 if (function_exists('mb_convert_encoding')) $destValue = mb_convert_encoding($srcValue, M3_ENCODING, $mobileEncoding);
287 * @param string $srcStr 変換するデータ
288 * @return string 変換後データ
290 function convMobileText($srcStr)
293 $mobileEncoding = $this->gEnv->getMobileEncoding();
296 if (function_exists('mb_convert_encoding')) $destStr = mb_convert_encoding($srcStr, $mobileEncoding, M3_ENCODING);
302 * @return bool true=GETメソッド、false=GET以外
304 function isGetMethod()
306 $method = strtoupper($this->trimServerValueOf('REQUEST_METHOD')); // アクセスメソッド
307 if ($method == 'GET'){
316 * @return bool true=POSTメソッド、false=POST以外
318 function isPostMethod()
320 $method = strtoupper($this->trimServerValueOf('REQUEST_METHOD')); // アクセスメソッド
321 if ($method == 'POST'){
328 * $_SERVERから値を取得(トリミング(前後の空白削除)あり)
330 * $_SERVERから値を取得し、トリミング(前後の空白削除)する
332 * @param string $name キー値
333 * @param string $default 値が存在しないときのデフォルト値
336 public function trimServerValueOf($name, $default = '')
338 $value = isset($_SERVER[$name]) ? $_SERVER[$name] : $default;
341 if (is_array($value)){
342 $value = array_map('trim', $value);
344 $value = trim($value);
353 * @param string $name キー値
354 * @param string $default 値が存在しないときのデフォルト値
357 public function getSessionValue($name, $default = '')
359 $value = isset($_SESSION[$name]) ? $_SESSION[$name] : $default;
367 * @param string $name キー値
368 * @param string $value 格納値
371 public function setSessionValue($name, $value = '')
373 $_SESSION[$name] = $value;
380 * @param string $name キー値
383 public function unsetSessionValue($name)
385 unset($_SESSION[$name]);
388 * セッションからシリアライズされた値を取得
390 * @param string $name キー値
391 * @return object 取得したオブジェクト、なしの場合はnull
393 public function getSessionValueWithSerialize($name)
395 $value = isset($_SESSION[$name]) ? unserialize($_SESSION[$name]) : null;
401 * @param string $name キー値
402 * @param object $value 格納するオブジェクト、nullをセットした場合はセッション値を削除
405 public function setSessionValueWithSerialize($name, $value = null)
408 unset($_SESSION[$name]);
410 $_SESSION[$name] = serialize($value);
416 * @param string $name キー値
417 * @param string $default 値が存在しないときのデフォルト値
420 public function getCookieValue($name, $default = '')
423 $value = isset($this->tmpCookie[$name]) ? $this->tmpCookie[$name] : ''; // クッキー送信前のクッキー格納データ
425 if ($value == '') $value = isset($_COOKIE[$name]) ? $_COOKIE[$name] : $default;
431 * @param string $name キー値
432 * @param string $value 格納値
433 * @param int $expireDay クッキーの生存期間(日)
436 public function setCookieValue($name, $value = '', $expireDay = 30)
438 $cookExpire = time() + 60 * 60 * 24 * $expireDay;
439 setcookie($name, $value, $cookExpire);
442 $this->tmpCookie[$name] = $value; // クッキー送信前のクッキー格納データ
447 * @return array URLクエリー文字列を解析した配列
449 public function getQueryArray()
453 if (!isset($queryArray)){
454 $queryArray = array();
455 $queryStr = self::trimServerValueOf('QUERY_STRING');
456 if (!empty($queryStr)){
457 parse_str($queryStr, $queryArray);
464 * クエリー文字列中のWikiページ名を取得
466 * @return string Wikiページ名、空の時はWikiページ名なし
468 public function getWikiPageFromQuery()
471 $args = explode('&', $_SERVER['QUERY_STRING']);// 「&」で分割
472 for ($i = 0; $i < count($args); $i++){
474 $pos = strpos($line, '=');
475 if ($pos){ // 「=」が存在するとき
476 //list($key, $value) = explode('=', $line);
478 $wikiPage = $line; // 「=」なしのパラメータはwikiパラメータとする
487 * '(シングルクオート)、" (ダブルクオート)、\(バックスラッシュ) 、NULLにバックスラッシュでエスケープ処理を行う
489 * @param string $str 変換元文字列
490 * @return string 変換後文字列
492 /* function gpc_addslashes($str){
493 if ($this->magicQuote){
496 return addslashes($str);
502 * '(シングルクオート)、" (ダブルクオート)、\(バックスラッシュ) 、NULLのバックスラッシュでのエスケープ処理を削除
504 * @param string $str 変換元文字列
505 * @return string 変換後文字列
507 function gpc_stripslashes($str){
508 if ($this->magicQuote){
509 return stripslashes($str);
514 //******************************************************
515 // patTemplateのテンプレートに値を埋め込む。値を省略した場合は、POST,GETデータから取得したデータを再設定する。
516 // $name: patTemplateのテンプレート名
517 // $valueName: HTMLタグに設定した名前。patTemplateの値埋め込み用キーワードも同じものを使用する。
518 // $default: 値埋め込み用キーワードに埋め込む値。省略の場合はPOST,GETデータから$valueNameの値を取得する。
519 function addValueToTemplate($name, $valueName, $default = null)
521 if ($default == null){
522 $this->tmpl->addVar($name, $valueName, $this->valueOf($valueName));
524 $this->tmpl->addVar($name, $valueName, $default);
530 function _sessionOpen($save_path, $session_name)
537 function _sessionClose()
544 function _sessionRead($id)
546 return $this->db->readSession($id);
551 * @param string $id セッションID
552 * @param string $sessData セッションデータ
554 function _sessionWrite($id, $sessData)
556 return $this->db->writeSession($id, $sessData);
561 * @param string $id セッションID
563 function _sessionDestroy($id)
565 return $this->db->destroySession($id);
570 * @param int $maxlifetime セッションの生存時間(秒)
572 function _sessionGc($maxlifetime)
574 return $this->db->gcSession($maxlifetime);