2010-07-14 63 views
3

我們有幾個Web應用程序可以創建購物車,將其保存到數據庫,然後重定向到集中的Web應用程序以處理並接受購物車付款。現在,我們使用購物車ID的GUID並將查詢字符串中的GUID傳遞給付款應用程序。我們使用的是GUID,因此用戶無法輕鬆猜測其他用戶的購物車ID,只需將該ID插入到URL中即可。在Web應用程序之間傳遞ID

現在,在數據庫中使用GUID不利於索引,並且在URL中使用GUID並不能真正阻止用戶訪問其他購物車。但是,使用傳遞整數會使其變得太簡單。

什麼是最好和最安全的方式將ID從個人應用程序傳遞到集中支付應用程序?

我知道有人會說:「誰在乎別人是否想爲別人的購物車付錢?」但是,在將ID傳遞到顯示收據的頁面並且該頁面包含客戶名稱時,我們也有同樣的擔憂。

+1

他們在不同的域名? – Fosco 2010-07-14 13:06:49

+0

他們在同一個域上。 – NYSystemsAnalyst 2010-07-14 13:14:52

回答

1

您可以將ID作爲整數與「令牌」一起傳遞,該令牌將是購物車ID和隨機祕密字符串的(密碼強的)散列。支付處理器會知道祕密,所以它可以執行散列本身並進行比較以查看它是否有效。

例如,你可以使用下面的(未經測試)代碼來創建令牌:

public static string GenerateHash(long CartID) 
{ 
    string SourceText = CartID.ToString(); 
    //Salt the source text (secret) 
    SourceText += "5E95C91F7F947BD92ACA2CF81C3ADBD9B563839D85EA69F9DEA5A2DC330D0F50"; 
    //Create an encoding object to ensure the encoding standard for the source text 
    UnicodeEncoding Ue = new UnicodeEncoding(); 
    //Retrieve a byte array based on the source text 
    byte[] ByteSourceText = Ue.GetBytes(SourceText); 
    //Instantiate an MD5 Provider object 
    System.Security.Cryptography.SHA1CryptoServiceProvider SHA1 = new System.Security.Cryptography.SHA1CryptoServiceProvider(); 
    //Compute the hash value from the source 
    byte[] ByteHash = SHA1.ComputeHash(ByteSourceText); 
    //And convert it to String format for return, also modify for URL use 
    return Convert.ToBase64String(ByteHash).Replace("=", "").Replace("+", "-").Replace("/", "_"); 
} 

結果傳遞這個功能,你的車ID一起,因爲哈希是一個單向函數不能逆轉。在付款處理器上,您可以在傳入的購物車ID上調用相同的功能,並將其與令牌進行比較。

這將防止篡改查詢字符串,但允許您使用整數。

+0

我想我要使用此解決方案的一個版本。我會將CartID更改爲有助於數據庫性能的整數。不過,我會爲每輛車保留一張Guid字段。這將是祕密。我將散列Guid並將查詢字符串中的散列值與CartID一起傳遞。然後,在接收端,付款應用程序可以查找傳入的購物車ID,散列該記錄的關聯Guid,並查看它是否與傳入的散列匹配。 – NYSystemsAnalyst 2010-07-15 12:29:38

1

你有沒有想過發佈到中央系統並傳遞值?然後,它們將不會在您的查詢字符串中可見。

+0

現在,應用程序保存自己的數據,然後重定向到支付應用程序。爲了進行POST,應用程序需要保存他們的數據,然後向用戶提供一個按鈕或鏈接,點擊「提交付款」。我想避免它,因爲這對用戶來說是一個額外的步驟。另外,之前版本的支付系統接受了POST,但它會打破後退按鈕。 – NYSystemsAnalyst 2010-07-14 13:17:55

0

如果您必須在查詢字符串中傳遞GUID,則可以對其進行加密以使其更安全一些。它也會給你的處理增加一點開銷。

你也可以將用戶的購物車綁定到cookie上,那麼GUID在查詢字符串中將不可見,並且會更難以檢測到(雖然使用提琴手或其他類似的工具會顯示正在傳遞的內容和下)。

我會把這個標識符粘貼在一個cookie,一些其他的頭文件中,或者,如果你必須POST,作爲一個隱藏的值(就像Lazarus建議的那樣)。我會避免在查詢字符串上。

+0

我想避免加密。使用cookie可能是一個選項。基本上,我不想使用GUID並使用整數來提高數據庫性能。整數似乎很容易在查詢字符串中操縱。 – NYSystemsAnalyst 2010-07-14 13:21:58

相關問題