我注意到,在为用户提供订单ID时,为在线商店提供一个简单的整数是不标准的做法。这是一种安全驱动的做法,还是允许更多字符长度较短的订单?
如果它是一个安全驱动的实践,那么生成这样一个ID的最佳方法是什么(考虑到数据库可能使用订单表主键的整数IDENTITY)?
答案 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);
}