28
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

EC-CUBE の SameSite cookie 対応まとめ

Last updated at Posted at 2020-02-10

EC-CUBE の SameSite cookie 対応がバージョンごとに散乱していて、わかりづらいのでまとめてみます

SameSite cookie とは

Chrome 80が密かに呼び寄せる地獄 ~ SameSite属性のデフォルト変更を調べてみた がわかりやすいです。

EC-CUBE の影響

標準状態では影響はありません。

  • 標準状態では、クロスサイト Cookie は使用していない
  • 外部サイトから POST で戻ってくるケースは、そもそも CSRF 対策でブロックしている

しかし、 一部の決済連携や独自カスタマイズで影響の出るケースがあります

  • 3Dセキュアや、キャリア決済、ID決済などの決済連携で POST で戻ってくるケース
  • 外部サイトから直接カートに入れるようカスタマイズしているサイト

詳細は EC-CUBE/ec-cube#4457 をご覧ください。

影響の出るケースでは、以下のような不具合が発生します。

  • 決済完了画面が表示されず、エラーとなる。
  • 決済完了画面は表示されるが、ログアウトされた状態となる。
  • 決済完了画面は表示されるが、カートの中身がクリアされない。
  • カートが空になり、ログアウトされた状態となる。

対応にあたっての課題

  • PHP の session_set_cookie_params() 関数は、 PHP7.3未満とそれ以上で振舞いが違うため、PHPバージョンで分岐する必要がある
  • iOS12, macOS10.14 など、SameSite=None に未対応のブラウザがある。これらのブラウザはリリース当時の SameSite standard draft を厳密に実装しているため、 SameSite=None を Strict と認識する
  • SameSite=None の場合は、 secure 属性が必須となる

EC-CUBE バージョンごとの対応方針

基本的に SSL 必須。 今後、 SSL 未対応のサイトでは決済連携できなくなると考えてよいと思われる。

2020年2月17日頃までには、公式パッチがリリースされる予定です。

2系

EC-CUBE/ec-cube2#374 で修正。
2.4〜2.13 までの対応方法も上記 Pull Request 参照

3系

EC-CUBE/ec-cube3#82 で修正予定。

  • 3系の過去バージョンも、上記と同様の修正をすることで対応可能

4系

EC-CUBE/ec-cube#4519 で修正予定。

  • 4系の過去バージョンも、上記と同様の修正をすることで対応可能

(以下は3系の古い情報です)

  • PHP7.3未満 :: session.storage.options の cookie.path に '; SameSite=None' を追記し、 cookie.secure を true とする
  • PHP7.3以上 :: Symfony/HttpFoundation bundle にパッチを当てる必要がある

session.storage.options の cookie.path に '; SameSite=None' を追記し、 cookie.secure を true とする

  • 上記の対応をすると、 localhost など SSL の使用できない開発環境では、セッションが無効となりカートやログインが動作しなくなるため注意。
  • 未対応ブラウザへの対応は個別にする必要がある。
  • Symfony は setcookie() 関数ではなく、生の header を送信して cookie を設定するため、 PHP7.3 における setcookie() 関数仕様変更の影響を受けない模様

(以下は4系の古い情報です)

Symfony/HttpFoundation bundle のバージョンアップで対応可能になる予定。

それまでは暫定措置として以下のように対応する

app/config/eccube/packages/framework.yaml の cookie.path に '; SameSite=None' を追記し、 cookie.secure を true とする

その他

SameSite=None に対応していない環境の検証をしようと試みた。
が、以下の環境で外部サイトから POST されるケースでは、 SameSite=None が Strict と認識されるようなことは無く、 SameSite 属性は無視されて Cookie が拒否されることは無かった

iOS12.4(実機)では、 Cookie が拒否されるのを再現確認しました

参考

28
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?