我有一个小型的PHP / MySQL购物车系统,用户可以在其中添加产品,结帐和付款 这些产品都有ID,以便在用户结账时, 我可以获得该产品的属性(价格,重量,供应商的帐户ID等)。
现在,有人打开Firebug非常容易 猜测另一个产品ID,更改它和结帐。
防止这种情况的最佳方法是什么? 如果重要的话,商店和结账系统在两个不同的域上 我可以使用类似于唯一令牌的东西 但如果多个客户可以同时使用购物车,那该怎么办呢?
编辑:哇,输入太快,遗漏了一些重要的细节。该购物车目前表示为存储在PHP会话中的JSON。所有产品都有一个account_id,将其与供应商的帐户相关联。
如果用户更改了产品ID并且碰巧在另一个供应商的帐户下获得产品(实质上是从另一家公司的商店购买另一家公司的产品),则会出现问题,这是不可取的。谢谢你到目前为止的答案。
答案 0 :(得分:3)
使用服务器端会话存储购物车详细信息。
每个会话都会获得一个存储在Cookie中的唯一ID。所有详细信息(所选项目,金额等)都与此sessionId相关联。
根据定义,您不希望不同的客户使用同一购物车。相反,每个定制者都使用他们自己的购物车副本。
如果您需要与某些外部服务“共享”sessionId,请计算单独的唯一密钥并与第三方服务共享此密钥(=您的情况下的结帐服务)。
这可以确保您可以在与第三方的通信中唯一地识别您的客户,而不会让第三方了解您如何识别或与您的客户沟通。 (要记住的重要一点是,sessionId是一个共享秘密,没有其他人应该知道它。)
答案 1 :(得分:1)
如果您有权访问购物车系统,正确的方法是在运行付款之前将其复制ID查找和成本计算。这样,如果有人从1.99美元的糖果盒改为1999.99美元的高清电视,他们将收取电视费用。
如果您无法访问购物车系统,或者您无法告诉它产品是什么以及它们的成本。获得一个新的购物车系统。
作为旁注:您绝不应该信任来自用户的数据。应该没有必要建立信任用户。只需接受ID并运行服务器上的所有数字。
答案 2 :(得分:0)
执行此操作的一种方法是使用哈希。当他们选择产品并呈现表单时,请获取产品ID的哈希值并将其存储在产品ID旁边的隐藏字段中。当“结帐”帖子发生时,请获取已过帐的产品ID的哈希值,并将其与表单中发送的产品ID进行比较。如果它们不匹配,则产品ID已被篡改。我不熟悉PHP,所以无法提供代码示例,但我在ASP.NET中使用了这种方法,它很有魅力。
希望有道理!
答案 3 :(得分:0)
威胁是什么?如果客户端只有产品ID,那么如果他们更改了ID,他们就会购买不同的产品,就是这样。或者您的产品并非适用于所有人?如果不是,则需要使用随机ID,以便不会轻易猜到。
答案 4 :(得分:-1)
我认为您需要做的是加密/解密您的产品ID并使用它。 你可以使用base64_encode()和base64_decode()
希望这会有所帮助