Database design 电子商务站点是否应该使用模糊的订单Id

Database design 电子商务站点是否应该使用模糊的订单Id,database-design,e-commerce,security,Database Design,E Commerce,Security,我注意到,在向用户提供订单ID时,在线商店使用一个简单的整数不是标准做法。这是一种安全驱动的做法,还是允许更多字符长度更短的订单 如果这是一种安全驱动的做法,那么生成这样一个ID的最佳方法是什么(考虑到数据库可能对订单表主键使用整数标识)?您仍然可以使用整数作为标识,但有一个Order ref字段(该字段仍可以在数据库中索引),如您所述。我不认为这是安全问题,我认为这可能有点像我第一次开具的发票没有编号0001。人们通常不想宣传他们才刚刚起步的事实 说到这里,如果您愿意,我可以给您一段代码来生成

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


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

您仍然可以使用整数作为标识,但有一个Order ref字段(该字段仍可以在数据库中索引),如您所述。我不认为这是安全问题,我认为这可能有点像我第一次开具的发票没有编号
0001
。人们通常不想宣传他们才刚刚起步的事实

说到这里,如果您愿意,我可以给您一段代码来生成任意长度的看似随机的字母数字顺序代码

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

    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);
    }

这主要是为了用户不能查看其他人的订单

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

有一些方法可以确保这一点,比如确保用户已登录并且订单属于他们。您可以为主键保留一个整数标识,如果这样更便于内部使用的话


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

这会很有趣,即使我不使用它。请做!因此,只要它是安全的(插入不同的号码不会让你访问该订单),就没有必要混淆它?@Tyrsius,除了不想让用户知道某人处理了多少订单之外(正如多默所指出的),如果订单足够安全,我认为没有必要混淆。是的,我认为如果你按照布兰登说的做,确保只有商店管理员或相关客户才能看到特定客户的订单,您可以非常安全地使用序列号。@Brandon将用户订单ID作为UUID类型,并使用与面向用户的ID相同的ID是一个好主意吗?@Sunny,在大多数情况下应该可以。