ホーム » ビジネスブログ »

Zen Cart(オンラインショップ構築)

2020年8月27日

Zen Cart:Google Chrome SameSite Cookie対応について

Zen Cart(オンラインショップ構築) 

投稿者 竹村

sample.pngのサムネイル画像

2020年 2月頃にGoogleがブラウザChromeて、CookieのSameSiteのデフォルトの挙動を「None」から「Lax」に変更するということで、当時急いで修正したのが記憶に新しいですが、その後、新型コロナの影響で適用を延ばすということで、しばらくは問題もなく過ぎていきました。

最近、7月中旬からこの対応を含んだアップデートが提供されたようで、影響が出てきています。Zen Cartにおいて顕著にこの対応が影響するのは、外部サイトと連携する部分、つまりクレジットカード決済です。

Zen Cartで注文する直前まで進めてクレジットカード決済で、カード決済会社の画面でクレジットカード情報を入力し、戻ってくると「タイムアウト」になってしまう。そういう現象が発生しています。

原因

Zen CartのセッションはデフォルトでCookieにセッションIDを保存しています。よって、Cookieが取れなくなると自動的にログアウト扱いになるので「タイムアウト」画面が表示されます。

SameSite=Laxでは、「外部サイトがPOSTする場合、Cookieヘッダーは渡らない」仕様になっています。よって、SameSiteの影響を受けるかどうかは外部サイトがPOSTをしてZen Cartに戻ってくる場合に限ります。

注意点:SameSiteのiOS12/MacOS10.14対応

iOS12より前の機種と、MacOS 10.14より前の場合に「SameSite=None」が設定されていると「SameSite=Strict」扱いになってしまい、外部サイト連携ができなくなります。よって、$__SERVER['HTTP_USER_AGENT']で判定をして、該当の場合はSameSite属性を発行しないようにします。

対応:cookie_testに注意!

  • ショップをSSL化してクッキーのSecure属性をTrueにする
  • セッション用に使うクッキーのSameSite=Noneをする
  • cookie_test というクッキーのSameSite=Noneをする

※3つ目に気づかずにハマりました。Zen CartではCookieが有効かどうかを判断するのにcookie_testというCookieを発行していますが、これにもSameSite対応をする必要があります。

  • includes/init_includes/init_sessions.php (もしくは includes/init_includes/overrides/init_sessions.php)にて、パスにSameSite対応をしてSecureにする
    $path = str_replace('\\', '/', dirname($_SERVER['SCRIPT_NAME']));
    if (defined('SESSION_USE_ROOT_COOKIE_PATH') && SESSION_USE_ROOT_COOKIE_PATH == 'True') $path = '/';
    $path = (defined('CUSTOM_COOKIE_PATH')) ? CUSTOM_COOKIE_PATH : $path;
    $domainPrefix = (!defined('SESSION_ADD_PERIOD_PREFIX') || SESSION_ADD_PERIOD_PREFIX == 'True') ? '.' : '';
    $secureFlag = ((ENABLE_SSL 'true' && substr(HTTP_SERVER, 0, 6) 'https:' && substr(HTTPS_SERVER, 0, 6) 'https:') || (ENABLE_SSL 'false' && substr(HTTP_SERVER, 0, 6) == 'https:')) ? TRUE : FALSE;

    // 関数追加
    function is_before_iOS12() {
    // iOS12より前かどうか
    if (preg_match('@iPhone; CPU iPhone OS (1[0-2]|[0-9][^0-9])@', $_SERVER['HTTP_USER_AGENT'])) { return true; }
    if (preg_match('@iPad; CPU OS (1[0-2]|[0-9][^0-9])@', $_SERVER['HTTP_USER_AGENT'])) { return true; }
    if (preg_match('@iPod touch; CPU iPhone OS (1[0-2]|[0-9][^0-9])@', $_SERVER['HTTP_USER_AGENT'])) { return true; }
    // MacOS 10.14より前かどうか
    if (preg_match('@Macintosh; Intel Mac OS X 10_(1[0-4]|[0-9][^0-9]).*Safari@', $_SERVER['HTTP_USER_AGENT'])) { return true; }
    return false;
    }


    // 下記1行を追記
    $path .= is_before_iOS12() ? '' : '; SameSite=None';

    if (PHP_VERSION >= '5.2.0') {
    session_set_cookie_params(0, $path, (zen_not_null($cookieDomain) ? $domainPrefix . $cookieDomain : ''), $secureFlag, TRUE);
    } else {
    session_set_cookie_params(0, $path, (zen_not_null($cookieDomain) ? $domainPrefix . $cookieDomain : ''), $secureFlag);
    }

    (中略)

    zen_setcookie('cookie_test', 'please_accept_for_session', time()+60*60*24*30, '/', (zen_not_null($current_domain) ? $current_domain : ''));
      ↓
    zen_setcookie('cookie_test', 'please_accept_for_session', time()+60*60*24*30, '/'. is_before_iOS12() ? '' : '; SameSite=None', (zen_not_null($current_domain) ? $current_domain : ''), $secureFlag);

この問題への対処でお困りのことがあれば、ご相談ください(有償対応となります)。

投稿者 竹村 : 15:26

その他の記事

Zen Cart v1.3 日本語版がリリースされました!

  • 2006年12月 5日
  • 投稿者 : 進地

Movable Type用高機能メールフォーム生成プラグイン A-Formの詳細へ
Movable Type用会員限定サイトプラグイン A-Memberの詳細へ
Movable Type用予約サイト構築プラグイン A-Reserveの詳細へ
ARK-Web×CSR(企業の社会的責任)

アークウェブの本

Zen Cartによるオンラインショップ構築・運用テクニック―オープンソース徹底活用

Zen Cartによるオンラインショップ構築・運用テクニック―オープンソース徹底活用

内容充実のZen Cart公式本(v1.3対応)がついに発表です。アークウェブのスタッフをはじめZen-Cart.JPの中心メンバーが共著で執筆しました。続きを読む

Movable Type プロフェッショナル・スタイル

Movable Type プロフェッショナル・スタイル

ビジネスサイト構築におけるCMSとしてのMTの活用方法について、豪華執筆陣による実践的MT本です。八木が共著で執筆しました。続きを読む

Web屋の本

Web屋の本

Web 2.0時代の企業サイトの構築・運用などの戦略を考える「Web屋の本」 (技術評論社)を、中野・安藤が執筆しました。続きを読む

新着はてブ

Loading

アーカイブ

応援しています

  • キッズ・セーバー
  • ソロモン・リリーフ ─ソロモン諸島を応援する有志による、震災復興支援プロジェクト─

    (終了しました)

RSS配信

 

サービスおよびソリューション一覧


最新情報・投稿をチェック


このページのトップに戻る

Photo by A is for Angie

Powered by Movable Type Pro 6.3.8