【问题标题】:Setting the cart session in Cookie在 Cookie 中设置购物车会话
【发布时间】:2014-03-07 14:59:37
【问题描述】:

我正在创建一个购物车,我只是使用会话来更新购物车。但我想将其设置为 cookie 并检索它以供进一步使用...我的购物车会话是:

$_SESSION['cart'][$pid] = array("item_id" => $pid, "quantity" => $tobesend, "price" => $price_per_q);

我想把这整件事都设置到 cookie 中。请帮忙。 而且我想知道如果我在这里使用网络存储而不是cookie有什么好处......

谢谢你..

【问题讨论】:

  • 找到你的答案@nick?

标签: php session cookies web-storage


【解决方案1】:

Cookies 被任何使用用户浏览器的人访问,最好的办法是将购物车会话存储在数据库中,并且仅将该数据库条目的行 ID 存储在 cookie 中。所以基本上:

// Store the data in the database, in whatever form you choose
$id = last_insert_id(); // Get the ID of the row in which this information is stored

// Store the id in a cookie
setcookie("cart_session_data_id", $id, time() + 3600 * 24);  /* expire in 1 day */

现在您可以在需要时将数据从数据库中检索回会话中

// Get the row id from the cookie
$id = $_COOKIE['cart_session_data_id'];

// Use this ID and retrieve the data from the database

为什么选择网络存储而不是 cookie?

  1. 将敏感数据存储在 cookie 中是不明智的,因为 XSS 攻击可以获取所有 cookie
  2. Cookie 限制每个域 4096 字节

更多资源:

  1. http://davidwalsh.name/php-cookies
  2. http://in3.php.net/setcookie
  3. Local Storage vs Cookies
  4. Keep $_SESSION alive with autorenewing counter

【讨论】:

  • 这是存储敏感信息的正确方式。 +1 用于存储在数据库和您列出的文档中。
  • id、数量、价格等信息的敏感性我真的不明白……你能解释一下吗?
  • 敏感信息(我的定义)是您/您的客户不希望任何黑客入侵您客户的系统时获得的任何信息。假设一个嫉妒的朋友入侵了您客户的计算机,您不希望该朋友知道您的客户正在购买安全套或私人物品,或者他打算花费 $x 购买。
  • 好的。如果我嫉妒的朋友知道客户想要购买的避孕套,他会做任何可能对我的系统或客户有害的事情吗?我不是在谈论个人事务。我是在谈论不让交易发生或损坏我的系统的任何东西?
  • 不,从技术角度来看,该人不能损害您的系统。从业务角度来看,您将客户视为电子商务系统的主要组成部分,因此,如果信息损害了您的客户,那么他们就会损害您的系统。
【解决方案2】:

正如@Joshua Kissoon 所提到的,cookie 只能用于非敏感信息和少量数据。如果您需要使用 cookie,您可以将数据设置为数组并对其进行序列化:

$cart = array($pid => array("item_id" => $pid, "quantity" => $tobesend, "price" => $price_per_q));
setcookie("cart", serialize($cart));

检查它然后访问它:

if (!empty($_COOKIE) && isset($_COOKIE['cart'])) {
    $cart = unserialize($_COOKIE['cart']);
    echo '<pre>';print_r($cart);echo '</pre>';
}

我只会将它用于不重要的数据。

【讨论】:

  • 究竟什么是重要的?我在这里存储购物车的价格、数量和产品 ID。这怎么会如此重要?尝试 XSS 攻击可以用这些信息做什么?
  • 你是判断者 - 在使用 cookie 时提及任何安全风险很重要
  • 我想说重要的数据应该是“需要安全的数据”。
【解决方案3】:

正如 Joshua 所指出的,cookie 并不是存储购物车信息的最佳场所。此类信息应保存在服务器上。根据您的要求,这可能是会话数据或数据库。在客户端上存储购物车信息不允许对购物车内容有任何了解。例如,如果有人将商品留在购物车中,您可以通过向店面页面发送提醒或添加消息来吸引他们。

要回答您的问题,cookie 是字符串,因此如果您想将购物车数据结构存储为 cookie,则需要对其进行序列化。有关serializejson_encode 的技术优点的讨论,请参阅this earlier question

“网络存储”一词有点含糊。您指的是 HTML5 本地存储吗?如果是这样,这可能不是一个好的选择,因为数据不会像 cookie 那样在每个请求上自动发送到服务器。

【讨论】:

    猜你喜欢
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 2014-04-03
    • 2021-10-31
    • 2011-08-18
    相关资源
    最近更新 更多