2010-11-24 36 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,以便他們不容易被猜出。

相關問題