我们有几个 Web 应用程序可以创建购物车,将其保存到数据库,然后重定向到一个集中的 Web 应用程序来处理和接受购物车的付款。现在,我们将 GUID 用于购物车 ID,并将查询字符串中的这些 GUID 传递给支付应用程序。我们正在使用 GUID,这样用户就不能轻易猜到另一个用户的购物车 ID,而只需将该 ID 插入 URL。
现在,在数据库中使用 GUID 不利于索引,并且在 URL 中使用 GUID 并不能真正阻止用户访问另一个购物车。但是,使用传递整数会使其变得太容易。
将 ID 从单个应用程序传递到集中支付应用程序的最佳和最安全的方法是什么?
我知道有些人可能会说,“谁在乎别人是否愿意为别人的购物车买单?”但是,在将 ID 传递到显示收据且该页面包含客户姓名的页面时,我们也有同样的担忧。
最佳答案
您可以将 ID 作为整数与“ token ”一起传递,该“ token ”将是购物车 ID 和随机 secret 字符串的(加密强)散列。支付处理器会知道这个 secret ,所以它可以自己执行散列并比较它是否有效。
例如,您可以使用以下(未经测试的)代码来创建 token :
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 调用相同的函数并将其与 token 进行比较。
这将防止篡改查询字符串,但允许您使用整数。
关于asp.net - 在 Web 应用程序之间传递 ID,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3246361/