/** * セッションパラメーターの指定 * ・ブラウザを閉じるまで有効 * ・EC-CUBE ルート配下で有効 * ・同じドメイン間で共有 * FIXME セッションキーのキーが PHP デフォルトのため、上位ディレクトリーで定義があると、その値で動作すると考えられる。 **/ public function initSession() { parent::initSession(); ini_set('session.cache_limiter', 'none'); // (session.auto_start などで)セッションが開始されていた場合に備えて閉じる。(FIXME: 保存する必要はない。破棄で良い。) session_write_close(); session_set_cookie_params(0, ROOT_URLPATH, DOMAIN_NAME); // セッション開始 // FIXME EC-CUBE をネストしてインストールした場合を考慮して、一意とすべき session_name('ECSESSID'); session_start(); }
/** * セッション初期処理を行う。 * * @return void */ public function initSession() { parent::initSession(); // セッションIDの受け渡しにクッキーを使用しない。 ini_set('session.use_cookies', '0'); ini_set('session.use_trans_sid', '1'); ini_set('session.use_only_cookies', '0'); // パラメーターから有効なセッションIDを取得する。 $sessionId = $this->getSessionId(); if (!$sessionId) { session_start(); } /* * PHP4 では session.use_trans_sid が PHP_INI_PREDIR なので * ini_set() で設定できない */ if (!ini_get('session.use_trans_sid')) { output_add_rewrite_var(session_name(), session_id()); } // セッションIDまたはセッションデータが無効な場合は、セッションIDを再生成 // し、セッションデータを初期化する。 if ($sessionId === false || !$this->validateSession()) { session_regenerate_id(true); // セッションデータの初期化 $this->state->inisializeSessionData(); // 新しいセッションIDを付加してリダイレクトする。 if ($_SERVER['REQUEST_METHOD'] == 'GET') { // GET の場合は同じページにリダイレクトする。 $objMobile = new MobileHelper(); header('Location: ' . $objMobile->gfAddSessionId()); } else { // GET 以外の場合はトップページへリダイレクトする。 header('Location: ' . TOP_URL . '?' . SID); } exit; } // 有効期限を更新する. $this->state->updateExpire(); }
/** * アプリケーション内でリダイレクトする * * 内部で生成する URL の searchpart は、下記の順で上書きしていく。(後勝ち) * 1. 引数 $inheritQueryString が true の場合、$_SERVER['QUERY_STRING'] * 2. $location に含まれる searchpart * 3. 引数 $arrQueryString * @param string $location 「url-path」「現在のURLからのパス」「URL」のいずれか。「../」の解釈は行なわない。 * @param array $arrQueryString URL に付加する searchpart * @param bool $inheritQueryString 現在のリクエストの searchpart を継承するか * @param bool|null $useSsl true:HTTPSを強制, false:HTTPを強制, null:継承 * @return void * @static */ public function sendRedirect($location, $arrQueryString = array(), $inheritQueryString = false, $useSsl = null) { // ローカルフックポイント処理 $objPlugin = PluginHelper::getSingletonInstance(); if (is_object($objPlugin)) { $arrBacktrace = debug_backtrace(); if (is_object($arrBacktrace[0]['object']) && method_exists($arrBacktrace[0]['object'], 'getMode')) { $parent_class_name = get_parent_class($arrBacktrace[0]['object']); $objPlugin->doAction($parent_class_name . '_action_' . $arrBacktrace[0]['object']->getMode(), array($arrBacktrace[0]['object'])); $class_name = get_class($arrBacktrace[0]['object']); if ($class_name != $parent_class_name) { $objPlugin->doAction($class_name . '_action_' . $arrBacktrace[0]['object']->getMode(), array($this)); } } elseif (is_object($arrBacktrace[0]['object'])) { $pattern = '/^[a-zA-Z0-9_]+$/'; $mode = null; if (isset($_GET['mode']) && preg_match($pattern, $_GET['mode'])) { $mode = $_GET['mode']; } elseif (isset($_POST['mode']) && preg_match($pattern, $_POST['mode'])) { $mode = $_POST['mode']; } $parent_class_name = get_parent_class($arrBacktrace[0]['object']); $objPlugin->doAction($parent_class_name . '_action_' . $mode, array($arrBacktrace[0]['object'])); $class_name = get_class($arrBacktrace[0]['object']); if ($class_name != $parent_class_name) { $objPlugin->doAction($class_name . '_action_' . $mode, array($this)); } } } // url-path → URL 変換 if ($location[0] === '/') { $netUrl = new \Net_URL($location); $location = $netUrl->getUrl(); } // URL の場合 if (preg_match('/^https?:/', $location)) { $url = $location; if (is_bool($useSsl)) { if ($useSsl) { $pattern = '/^' . preg_quote(HTTP_URL, '/') . '(.*)/'; $replacement = HTTPS_URL . '\\1'; $url = preg_replace($pattern, $replacement, $url); } else { $pattern = '/^' . preg_quote(HTTPS_URL, '/') . '(.*)/'; $replacement = HTTP_URL . '\\1'; $url = preg_replace($pattern, $replacement, $url); } } // 現在のURLからのパス } else { if (!is_bool($useSsl)) { $useSsl = Utils::sfIsHTTPS(); } $netUrl = new \Net_URL($useSsl ? HTTPS_URL : HTTP_URL); $netUrl->path = dirname($_SERVER['SCRIPT_NAME']) . '/' . $location; $url = $netUrl->getUrl(); } $pattern = '/^(' . preg_quote(HTTP_URL, '/') . '|' . preg_quote(HTTPS_URL, '/') . ')/'; // アプリケーション外へのリダイレクトは扱わない if (preg_match($pattern, $url) === 0) { trigger_error('', E_USER_ERROR); } $netUrl = new \Net_URL($url); if ($inheritQueryString && !empty($_SERVER['QUERY_STRING'])) { $arrQueryStringBackup = $netUrl->querystring; // XXX メソッド名は add で始まるが、実際には置換を行う $netUrl->addRawQueryString($_SERVER['QUERY_STRING']); $netUrl->querystring = array_merge($netUrl->querystring, $arrQueryStringBackup); } $netUrl->querystring = array_merge($netUrl->querystring, $arrQueryString); $session = SessionFactory::getInstance(); if (Application::alias('eccube.display')->detectDevice() == DEVICE_TYPE_MOBILE || $session->useCookie() == false) { $netUrl->addQueryString(session_name(), session_id()); } $netUrl->addQueryString(TRANSACTION_ID_NAME, SessionHelper::getToken()); $url = $netUrl->getURL(); header("Location: {$url}"); exit; }
/** * Returns a callable given its string representation. * * @param string $name * * @return array A callable array * * @throws \InvalidArgumentException In case the method does not exist. */ public function convertCallback($name) { if (preg_match(static::PAGE_PATTERN, $name)) { return function (Application $app, Request $request) use($name) { // setpath $path_info = $request->getPathInfo(); if (substr($path_info, -1) == '/') { $path_info .= 'index.php'; } $_SERVER['SCRIPT_NAME'] = str_replace('/index.php', '', $request->server->get('SCRIPT_NAME')) . $path_info . (substr($path_info, -1) == '/' ? 'index.php' : ''); $_SERVER['SCRIPT_FILENAME'] = dirname($request->server->get('SCRIPT_FILENAME')) . $path_info; // rtrim は PHP バージョン依存対策 $GLOBALS['_realdir'] = rtrim(realpath(rtrim(realpath(dirname($request->server->get('SCRIPT_FILENAME'))), '/\\') . '/'), '/\\') . '/'; $GLOBALS['_realdir'] = str_replace('\\', '/', $GLOBALS['_realdir']); $GLOBALS['_realdir'] = str_replace('//', '/', $GLOBALS['_realdir']); define('HTML_REALDIR', $GLOBALS['_realdir']); /** HTMLディレクトリからのDATAディレクトリの相対パス */ define('HTML2DATA_DIR', '../app/'); define('USE_FILENAME_DIR_INDEX', null); if (!defined('DATA_REALDIR')) { define('DATA_REALDIR', HTML_REALDIR . HTML2DATA_DIR); } // アプリケーション初期化処理 if (!defined('CACHE_REALDIR')) { /** キャッシュ生成ディレクトリ */ define('CACHE_REALDIR', DATA_REALDIR . "cache/eccube/"); } \Eccube\Framework\Helper\HandleErrorHelper::load(); // アプリケーション初期化処理 $objInit = new \Eccube\Framework\Initial(); $objInit->init(); // Page instance $objPage = new $name($app); if ($objPage instanceof \Eccube\Page\Admin\AbstractAdminPage) { define('ADMIN_FUNCTION', true); } else { define('FRONT_FUNCTION', true); } // 定数 SAFE が設定されている場合、DBアクセスを回避する。主に、エラー画面を意図する。 if (!defined('SAFE') || !SAFE) { // インストール中で無い場合、 if (!GcUtils::isInstallFunction()) { // インストールチェック Utils::sfInitInstall(); // セッション初期化・開始 $sessionFactory = SessionFactory::getInstance(); $sessionFactory->initSession(); /* * 管理画面の場合は認証行う. * 認証処理忘れ防止のため, \Eccube\Page\Admin::init() 等ではなく, ここでチェックする. */ SessionHelper::adminAuthorization(); } } // bufferを初期化する if ($objPage instanceof \Eccube\Page\Admin\AbstractAdminPage) { ob_start(); } else { // 絵文字変換 (除去) フィルターを組み込む。 ob_start(array('\\Eccube\\Framework\\MobileEmoji', 'handler')); if (Application::alias('eccube.display')->detectDevice() == DEVICE_TYPE_MOBILE) { // resize_image.phpは除外 if (!$objPage instanceof \Eccube\Page\ResizeImage) { /* @var $objMobile MobileHelper */ $objMobile = Application::alias('eccube.helper.mobile'); $objMobile->sfMobileInit(); } } } $objPage->init(); $objPage->process(); $response = ob_get_contents(); ob_end_clean(); return $response; }; } else { return parent::convertCallback($name); } }
/** * パラメーターから有効なセッションIDを取得する。 * * @return string|false 取得した有効なセッションIDを返す。 * 取得できなかった場合は false を返す。 */ public function lfMobileGetSessionId() { // パラメーターからセッションIDを取得する。 $sessionId = @$_POST[session_name()]; if (!isset($sessionId)) { $sessionId = @$_GET[session_name()]; } if (!isset($sessionId)) { $sessionId = $this->lfMobileGetExtSessionId(); } if (!isset($sessionId)) { return false; } // セッションIDの存在をチェックする。 $sessionFactory = SessionFactory::getInstance(); if ($sessionFactory->sfSessRead($sessionId) === null) { GcUtils::gfPrintLog("Non-existent session id : sid={$sessionId}"); return false; } return session_id($sessionId); }