代码之家  ›  专栏  ›  技术社区  ›  DCNYAM

在Web应用程序之间传递ID

  •  3
  • DCNYAM  · 技术社区  · 14 年前

    我们有几个Web应用程序可以创建购物车,将其保存到数据库,然后重定向到一个集中的Web应用程序来处理和接受购物车的付款。现在,我们正在为购物车ID使用guid,并将查询字符串中的guid传递给支付应用程序。我们使用的是guid,这样用户就不能轻易猜测另一个用户的购物车ID,而只需将该ID插入到URL中。

    现在,在数据库中使用guid不利于索引,在URL中使用guid并不能真正阻止用户访问另一个购物车。然而,使用传递整数会使它变得太容易。

    将ID从单个应用程序传递到集中支付应用程序的最佳和最安全的方法是什么?

    我知道有些人会说,“谁在乎别人是否愿意为别人的购物车买单?”但是,在将ID传递到显示收据的页面时,我们也有同样的问题,该页面包含客户的姓名。

    4 回复  |  直到 14 年前
        1
  •  1
  •   Hugh Jeffner    14 年前

    您可以将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调用相同的函数,并将其与令牌进行比较。

    这将防止篡改查询字符串,同时允许您使用整数。

        2
  •  1
  •   Lazarus    14 年前

    你有没有想过把信息发布到中央系统,然后通过这种方式传递这些信息?那么它们在查询字符串中就不可见了。

        3
  •  0
  •   David Hoerster    14 年前

    如果必须在querystring中传递guid,可以对其进行加密以使其更安全。它也会给您的处理增加一点开销。

    您也可以将用户的购物车绑定到一个cookie,这样在查询字符串中就看不到guid,并且会有点难以检测(尽管使用fiddler或其他类似的工具可以显示上下传递的内容)。

    我会将标识符粘贴在cookie、其他头文件中,或者,如果必须发布,作为隐藏值(如Lazarus建议的那样)。我会避免把它放在查询字符串上。

        4
  •  0
  •   Alistair    14 年前

    我将使用类似于ASP.NET MVC中反伪造令牌的方法。

    http://davidhayden.com/blog/dave/archive/2009/04/29/AntiForgeryTokenInMVCFramework.aspx

    除了你的guid之外,在cookie和与用户绑定的数据库中保存一个随机ID。每次用户发出HTTP请求时,都要检查cookie是否与数据库匹配。很难同时纠正guid和cookie。