diff --git a/data/class/helper/SC_Helper_Session.php b/data/class/helper/SC_Helper_Session.php index 3afc866781..4ab8cbc182 100644 --- a/data/class/helper/SC_Helper_Session.php +++ b/data/class/helper/SC_Helper_Session.php @@ -65,6 +65,13 @@ function sfSessClose() { */ function sfSessRead($id) { if (!$this->objDb->sfTabaleExists("dtb_session")) return ''; + // SameSite=None を未サポート UA 向け対応 + if (empty($_COOKIE['ECSESSID']) && isset($_COOKIE['legacy-ECSESSID']) && $id !== $_COOKIE['legacy-ECSESSID']) { + // session_id と $_COOKIE['legacy-ECSESSID'] が異なる場合は ECSESSID の cookie が拒否されたと見なす + GC_Utils_Ex::gfPrintLog('replace session id: ECSESSID=>legacy-ECSESSID'); + $id = $_COOKIE['legacy-ECSESSID']; // 互換用 cookie からセッションデータを読み込む + unset($_COOKIE['legacy-ECSESSID']); + } $objQuery = new SC_Query(); $arrRet = $objQuery->select("sess_data", "dtb_session", "sess_id = ?", array($id)); if (empty($arrRet)) { diff --git a/data/class/session/sessionfactory/SC_SessionFactory_UseCookie.php b/data/class/session/sessionfactory/SC_SessionFactory_UseCookie.php index a5e5ef591a..ed4ad5712c 100644 --- a/data/class/session/sessionfactory/SC_SessionFactory_UseCookie.php +++ b/data/class/session/sessionfactory/SC_SessionFactory_UseCookie.php @@ -47,14 +47,33 @@ class SC_SessionFactory_UseCookie extends SC_SessionFactory { * ・同じドメイン間で共有 **/ function initSession() { - if (session_id() === "") { - - session_set_cookie_params(0, "/", DOMAIN_NAME); + ini_set('session.cache_limiter', 'none'); + // (session.auto_start などで)セッションが開始されていた場合に備えて閉じる。(FIXME: 保存する必要はない。破棄で良い。) + session_write_close(); + $params = array( + 'lifetime' => 0, + 'path' => URL_DIR, + 'domain' => DOMAIN_NAME, + 'secure' => $this->getSecureOption(), + 'httponly' => true, + 'samesite' => '' + ); + if ($this->getSecureOption()) { + $params['samesite'] = 'None'; // require secure option + } + $samesite = ''; + if (!empty($params['samesite'])) { + $samesite = '; SameSite='.$params['samesite']; + } + session_set_cookie_params($params['lifetime'], $params['path'].$samesite, $params['domain'], $params['secure'], $params['httponly']); - if (!ini_get("session.auto_start")) { - // セッション開始 - session_start(); - } + // セッション開始 + // FIXME EC-CUBE をネストしてインストールした場合を考慮して、一意とすべき + session_name('ECSESSID'); + session_start(); + if (session_id() !== '') { + // SameSite=None を未サポートの UA 向けに 互換用 cookie を発行する. secure option 必須 + setcookie('legacy-'.session_name(), session_id(), $params['lifetime'], $params['path'], $params['domain'], true, true); } } @@ -66,6 +85,17 @@ function initSession() { function useCookie() { return true; } + + /** + * secure オプションの値を返す. + * + * この値をもとに secure オプションを設定する. + * @return bool HTTP_URL 及び HTTPS_URL が https の場合は true + */ + function getSecureOption() + { + return (strpos(SITE_URL, 'https') !== false && strpos(SSL_URL, 'https') !== false); + } } /* * Local variables: