web-dev-qa-db-ja.com

ショッピングカートの永続性:$ _SESSIONまたはブラウザCookieですか?

ユーザー名/ログインのないカートデータを保持するeコマースサイトでは、PHP $ _SESSION変数またはブラウザーCookieを使用してショッピングカート内のアイテムを保持する方が良いでしょうか?クッキーは無効にできるため、$ _ SESSIONに傾いていますが、あなたからの意見を聞きたいと思っています。

よろしくお願いします。

31
user1193509

どちらでもない

大規模なサイトでは、ユーザーのカートをセッションやCookieに保存することはありません。そのデータは貴重なものです。

顧客が購入しているもの、アイテムを選択したとき、購入した数、チェックアウトを完了しなかった理由など。すべてvery、veryあなたのビジネスにとって重要です。

データベーステーブルを使用してこの情報を保存し、ユーザーのセッションにリンクします。そうすれば、情報を失うことなく、ユーザーのカートに基づいて戻って統計を作成したり、チェックアウトプロセスの問題を解決したりできます。

可能なすべてをログに記録します。

データベーススキーマ

以下は、これがデータベースレベルでどのように見えるかの簡単な例です。

user {
    id
    email
}

product {
    id
    name
    price
}

cart {
    id
    product_id
    user_id
    quantity
    timestamp    (when was it created?)
    expired      (is this cart still active?)
}

また、カートテーブルを複数のテーブルに分割して、カートのリビジョンを追跡することもできます。

セッション

通常PHPセッションは2つの部分で構成されます

  1. データ(サーバー上のファイルに保存)
  2. ユーザーエージェント(ブラウザー)に与えられた一意の識別子

したがって、それは$_SESSION vs $_COOKIEではなく、$_SESSION+$_COOKIE = "session"です。ただし、データを含む単一の暗号化されたCookieを使用してこれを変更する方法があります(したがって、データを見つけるために識別子は必要ありません)。別の一般的なアプローチは、データを複数のサーバーがアクセスできるように、ファイルシステムではなくmemcachedまたはデータベースに保存することです。

@ Travesty3が言っているのは、two Cookie-セッション用のものと、「ログイン状態を維持する」Cookie(セッションCookieよりも長く存在するもの)、または個別のCookie内のデータのコピー。

43
Xeoncross

Xeoncrossが指摘したように、分析のために可能な情報を保存することは非常に重要です。したがって、セッションとCookieに完全に依存するべきではありません。

可能なアプローチは

ログインしていない場合はセッションを使用

ユーザーがログインしていない場合、PHPの$_SESSIONを使用して、セッションからカートアイテムとウィッシュリストアイテムを保存および取得できます。

ログイン時にデータベースを使用

ユーザーがログインしている場合、2つのオプションのいずれかを検討できます-

  • カートアイテムまたはウィッシュリストアイテムをデータベースのみに保存します
  • カート項目またはウィッシュリスト項目をデータベースとセッションに保存します(これにより、データベースクエリの一部が保存されます)

ユーザーがログインするとき

ユーザーがログインしたら、すべてのカートアイテムとウィッシュリストアイテムをセッションから取得し、データベースに保存します。

これにより、ユーザーがログアウトまたはマシンを変更してもデータは永続的になりますが、ユーザーがログインしない限り、情報を永続的に保存する方法がないため、永続的ではありません。

必要なデータの取得

カートまたはウィッシュリストにアクセスしようとするたびに、次のチェックを行います-

  • ユーザーがログインしていない場合は、セッションを調べます
  • ユーザーがログインしている場合、データベースに単独で保存している場合はデータベースを照会します。そうでない場合は、データベースとともにセッションを更新し続けている場合にセッションを調べることができます
6
MukeshD

セッションに保存します。私のウィッシュリストはかなり長く、COOKIEが占有する4Kストレージに収まらないのではないかと心配しています。セッションのタイムアウトをより長い期間に設定する必要があります。

注:Cookieについて非常に厳しいポリシーを設定している国(オランダなど)がいくつかあります。法律によってセッションの使用を強制される場合があります。

6
JvdBerg

役立ついくつかのポイント:

Cookie:

  • 情報は、Cookieの有効期限が切れるまで保持されます(ユーザーが構成できるもの)。
  • サーバーとクライアント間の通信は、すべての要求/応答で両者の間で交換する必要があるため、遅くなる傾向があります。
  • データを保存する安全でない形式で、簡単に盗聴できます。
  • また、データの保存にも制限があります。

セッション:

  • すべての情報はサーバーに保持されるため、クライアントとは交換されません。
  • ネットワーク全体で共有されないため、もう少し安全です。
  • セッションが終了すると、すべての情報が失われます。
  • 共有ホストでホストしている場合、同じサーバーでホストされているサイトのいずれかによるリソースのプッシュにより、操作の途中で終了するセッションで問題が発生する可能性があります。

私は個人的にはセッションに参加します。これは、中小規模のオーディエンスページであると想定しているためです。大きくなった場合は、単純なDB構造を使用してこのデータを保存し、不要なデータの山を取得するメンテナンスプラン(たとえば、一部の製品を選択したがチェックアウトを行わないクライアント)を使用することをお勧めします。

3
Ricardo Souza

両方の使用を検討してください。

$_SESSIONの欠点は、ブラウザーを閉じるとセッションがクリアされることです。

セッションを使用しますが、利用可能な場合はCookieから$ _SESSIONデータを入力しようとします。

3
Travesty3

セッションを使用します。ユーザーのCookieが無効になっている場合、セッションIDはユーザーのマシンのCookieに保存されるため、セッションは開始できません。

セッションをより長く維持しようとするために、見たい設定がいくつかあります。

  • ユーザーがブラウザを閉じるときに、lifetimeパラメーターを設定して session_set_cookie_params() を実行することにより、セッションCookieが削除されないようにします。この関数は session_start() の前に実行する必要があります

  • セッションガベージコレクションの設定を変更して、サーバーからセッションがクリアされる頻度を拡張することもできます _session.gc_probability, session.gc_divisor, session.gc_maxlifetime_ php.iniで、または ini_set()を使用して

  • サーバーで他のWebサイトを実行しており、上記のガベージコレクション設定を変更する場合、すべてのWebサイトに適用されるようにphp.iniで設定する必要があります。またはini_set()を使用している場合は、 session_save_path() を変更して、これらのセッションを他のWebサイトとは異なるディレクトリに保存します。繰り返しますが、これはsession_start()の前に実行されます。これにより、他のWebサイトのガベージコレクションによって、特定のサイトの拡張セッションがクリアされるのを防ぎます。

  • Php.ini _session.entropy_file = /dev/urandom, session.entropy_length = 256, session.hash_function = sha512_で次のセッション設定を設定することもお勧めします。これにより、非常に小さな衝突の可能性を持つ暗号的に強力なセッションIDが得られます。

  • また、セッションIDに対する中間者攻撃を防ぐために、サイトにSSL証明書があることを確認してください。

明らかに、ユーザーはセッションID Cookieを使用するすべてのCookieを手動でクリアすることを決定できますが、それは私が準備するリスクです。ショッピングカートシステムの途中でチェックアウトしていなかった場合、Cookieを消去しません。セッションはプレーンCookieを使用するよりも優れていると考えています。

セッションディレクトリにアクセスできる唯一のWebサイトであり、セッションIDが強力である限り、データは十分に安全です。また、サーバーのセッションストレージ時間を延長することにより、データをサーバーに保持できます。

セッションをさらに強化するために使用できる手段がさらにあります。 20分ごとにセッションIDを再生成し、データをコピーします。また、データベースのIPアドレスに対するセッションIDを記録し、特定のIPアドレスがセッションIDをブルートフォースしようとするのを防ぐために、特定の時間内にXを超えるセッションIDを送信しようとするかどうかを確認します。

サーバー上のセッションファイルではなく、セッションIDでリンクされたデータベースにデータを保存することもできます。ただし、これはまだCookieに保存されているセッションIDに依存しており、いつでも消える可能性があります。ユーザーがカートを紛失しないことを確実に保証する唯一の方法は、最初にログインしてデータベースに保存することです。

2
batfastad