Skip to content

Commit

Permalink
EC-CUBE2.4.x向け SameSite cookie パッチ
Browse files Browse the repository at this point in the history
  • Loading branch information
nanasess committed Feb 13, 2020
1 parent 574c150 commit 16ab907
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 7 deletions.
7 changes: 7 additions & 0 deletions data/class/helper/SC_Helper_Session.php
Original file line number Diff line number Diff line change
Expand Up @@ -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)) {
Expand Down
44 changes: 37 additions & 7 deletions data/class/session/sessionfactory/SC_SessionFactory_UseCookie.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}

Expand All @@ -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:
Expand Down

0 comments on commit 16ab907

Please sign in to comment.