diff --git a/data/class/helper/SC_Helper_Session.php b/data/class/helper/SC_Helper_Session.php index 2e116d8e32..b7e4b5628c 100644 --- a/data/class/helper/SC_Helper_Session.php +++ b/data/class/helper/SC_Helper_Session.php @@ -68,6 +68,13 @@ public function sfSessClose() */ public function sfSessRead($id) { + // 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 = SC_Query_Ex::getSingletonInstance(); $arrRet = $objQuery->select('sess_data', 'dtb_session', 'sess_id = ?', array($id)); if (empty($arrRet)) { diff --git a/data/class/sessionfactory/SC_SessionFactory_UseCookie.php b/data/class/sessionfactory/SC_SessionFactory_UseCookie.php index 7eb9e088d6..dba3e29483 100644 --- a/data/class/sessionfactory/SC_SessionFactory_UseCookie.php +++ b/data/class/sessionfactory/SC_SessionFactory_UseCookie.php @@ -46,11 +46,34 @@ public function initSession() ini_set('session.cache_limiter', 'none'); // (session.auto_start などで)セッションが開始されていた場合に備えて閉じる。(FIXME: 保存する必要はない。破棄で良い。) session_write_close(); - session_set_cookie_params(0, ROOT_URLPATH, DOMAIN_NAME, $this->getSecureOption(), true); + $params = array( + 'lifetime' => 0, + 'path' => ROOT_URLPATH, + 'domain' => DOMAIN_NAME, + 'secure' => $this->getSecureOption(), + 'httponly' => true, + 'samesite' => '' + ); + if ($this->getSecureOption()) { + $params['samesite'] = 'None'; // require secure option + } + if (PHP_VERSION_ID >= 70300) { + session_set_cookie_params($params); + } else { + $samesite = ''; + if (!empty($params['samesite'])) { + $samesite = '; SameSite='.$params['samesite']; + } + session_set_cookie_params($params['lifetime'], $params['path'].$samesite, $params['domain'], $params['secure'], $params['httponly']); + } // セッション開始 // 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); + } } /**