2010-11-24 77 views
1

我有这个小型的PHP/MySQL购物车系统,用户可以将产品添加到结帐和付款。
这些产品都对他们ID,这样当用户签出,
我可以得到该产品的属性(价格,质量,供应商的帐户ID等)。如何确保数据库中的产品ID不被篡改

现在对于有人打开Firebug,
猜测其他产品ID,更改它并结帐,真的很容易。

什么是防止这种情况的最好方法?
商店和结账系统在两个不同的领域是重要的。
我可以使用像一个独特的标记
但如何将这项工作如果多个客户可以使用车在同一时间?

编辑:哇,输入这个太快了,遗漏了一些重要的细节。购物车目前表示为正在存储在PHP会话中的JSON。所有产品都有一个将其与供应商帐户相关联的account_id。如果用户更改了产品标识,碰巧得到一个产品下另一个供应商的账户(主要来自不同公司的商店购买另一家公司的产品),这是不希望会发生

的问题。感谢您迄今为止的答案。

+1

购物车内容如何到达结帐处? – Gumbo 2010-11-24 14:18:42

+1

如果用户可以更改ID,那么为什么会出现这种问题 - 这就像是将其他项目添加到购物车中,不是吗?你当然在内部储存和计算价格和数量? – 2010-11-24 14:21:08

回答

3

使用服务器端的会话存储车的详细信息。

每个会话都会得到一个唯一的ID,存储在一个cookie中。所有细节(选定的项目,金额等)都与此sessionId相关联。

根据定义,你不想不同的客户使用相同的车。相反,每个定制者都使用他们自己的单独的购物车。

如果你需要“共享”的SessionID与一些​​外部的服务,而不是计算一个单独的唯一密钥,并共享与第三方服务(在你的案件= Checkout服务)这一关键。
这确保您可以唯一标识与第三方通信的客户,而无需第三方知道您如何识别您的客户或与客户进行沟通。 (要记住的重要一点是,sessionId是一个共享的秘密,其他人都不应该知道它)。

0

做到这一点的一种方法是使用散列。当他们选择产品并呈现表单时,请将产品ID散列并将其存储在产品ID旁边的隐藏字段中。发生“结帐”帖子时,请对发布的产品ID进行散列,并将其与表单中发送的产品ID进行比较。如果它们不匹配,那么产品ID已被篡改。我对PHP不熟悉,所以不能提供代码示例,但我在ASP.NET中使用了这种方法,它非常有用。

希望能说得通!

+0

产品ID的散列值也可能被篡改,但使用productID +用户无权访问的某些其他特定于产品的值的散列值,但后端确实存在,然后您就可以验证 – 2010-11-24 14:32:51

-1

我认为你要做的是加密/解密你的产品ID并使用它。 你可以使用BASE64_ENCODE()和BASE64_DECODE()

希望这将有助于

1

如果你有机会到购物车系统,正确的方法是有它运行在付款前复制ID查找和成本计算。这样,如果有人从1.99美元的糖果盒变成1999.99美元的高清电视,他们将收取电视费用。

如果您无法访问您的购物车系统,或者无法告诉它产品是什么以及它们的成本。获取新的购物车系统。

作为一个方面说明:你不应该信任来自用户的数据。应该不需要建立在信任用户的基础上。只需接受这些ID并运行服务器上的所有号码即可。

0

威胁是什么?如果客户端只有产品ID,那么如果他们更改ID,他们会购买不同的产品,这就是全部。或者您的产品并非全部可用?如果他们不是,你需要使用随机ID,以便他们不容易被猜出。

相关问题