电子商务网站是否应使用模糊的订单ID

时间:2011-12-13 22:48:11

标签: database-design e-commerce security

我注意到,在为用户提供订单ID时,为在线商店提供一个简单的整数是不标准的做法。这是一种安全驱动的做法,还是允许更多字符长度较短的订单?

如果它是一个安全驱动的实践,那么生成这样一个ID的最佳方法是什么(考虑到数据库可能使用订单表主键的整数IDENTITY)?

2 个答案:

答案 0 :(得分:2)

主要是因为用户无法查看别人的订单。

如果为用户分配了购物车/订单ID为1000,则可以安全地假设之前有999,之后可能是1001。

有一些方法可以确保这一点,例如确保用户已登录且订单属于他们。如果您更容易在内部使用,则可以为主键保留整数标识。

对于面向公众的方面,混淆订单ID的一种简单方法是为记录分配GUID。然后,您不是通过主键访问用户订单,而是通过GUID访问它。

答案 1 :(得分:1)

您仍然可以使用整数作为标识,但是有一个订单引用字段(仍可以在数据库中编制索引),如您所述。我不认为这是一个安全问题,我认为这可能有点像我发出的第一张发票不是数字0001的原因。人们通常不想宣传他们刚刚开始的事实。

说了这么多,我可以给你一段代码,如果你愿意,可以生成任意长度的看似随机的字母数字订单代码。

以下是C#中的代码:编辑:我添加了第一行(以前缺少的)代码行!

    static System.Random random = new Random();
    int lengthOfOrderCode = 6; // Obviously put what you like here
    char[] keys = "ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890".ToCharArray(); // and here. Doesn't need to be the entire alphabet and numbers...
    var orderCode = GenerateOrderCode(keys, lengthOfOrderCode); 

    private static string GenerateOrderCode(char[] keys, int lengthOfOrderCode)
    {
        return Enumerable.Range(1, lengthOfOrderCode).Select(k => keys[random.Next(0, keys.Length - 1)]).Aggregate("", (a, b) => a + b);
    }