【发布时间】:2015-07-26 18:19:22
【问题描述】:
我正在设计一个购物项目,并且正在考虑使用 unix 时间戳作为订单 ID。我知道我可以使用 mySQL 增量数字作为订单 ID,例如 10001、10002 等,但我不希望每个人都知道实际有多少订单。
这是一种安全的方法吗?我显然不希望每秒超过 1 个订单,所以我应该是安全的,对吧?
function check_number(){
$unique_number = time();
$exists = $this->count_rows('orders', "WHERE order_id='" . $unique_number . "'");
if ($exists >0){
$results = check_number();
}
else{
$results = $unique_number;
return $results;
}
}
【问题讨论】:
-
在递归调用之前放一个
sleep(1),以确保时间会改变。 -
或者只是使用循环增加
$unique_number直到你成功。 -
没有理由使用您的行标识符作为您的“订单号”,并且可能至少有几个很好的理由不这样做。一般来说,用户不应该看到内部行标识符。
-
@Uueerdo 为什么用户看到数据库 ID 会很重要?知道 id 不应该打开任何攻击向量,否则系统设计中存在严重缺陷。通过混淆的安全性不是您应该依赖的。 RESTful api 一直使用数据库 ID。
-
我并没有过多地谈论通过默默无闻的安全性。当然,在代码/api 级别,将其公开为“句柄”。我说的是网页上显示或打印在发票上的数字。这个数字对用户来说意义不大,如果它需要提供(支持),很容易被不那么诚实的人猜到有效的数字。此外,最终会出现使数字更加“用户友好”的诱惑,这现在开始影响您的数据库设计。 (突然之间有人想要带有字母的发票号码,或者每个区域都具有从 1 开始的区域前缀,等等......)