/**
  * セッションパラメーターの指定
  * ・ブラウザを閉じるまで有効
  * ・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();
 }
Ejemplo n.º 3
0
 /**
  * アプリケーション内でリダイレクトする
  *
  * 内部で生成する 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;
 }
Ejemplo n.º 4
0
 /**
  * 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);
     }
 }
Ejemplo n.º 5
0
 /**
  * パラメーターから有効なセッション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);
 }