【问题标题】:what are the cons of using unix timestamp as an order ID?使用 unix 时间戳作为订单 ID 的缺点是什么?
【发布时间】: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 开始的区域前缀,等等......)

标签: php mysql unix timestamp


【解决方案1】:
  1. 您可以创建一个 crontab ALTER TABLE orders AUTO_INCREMENT = max_id + <something>; 并每天或每小时随机移动它(虽然不是最好的做法);或者您可以在插入中随机放置 id(超过当前最大 id)。

  2. 如果您想在数据库中保留整数,可以使用base64_ family 和盐。

  3. 您可以在 URL 中使用唯一的 slugs

  4. 您可以使用com_create_guid 或类似函数,甚至可以生成随机字符串/数字,但请确保您在数据库中有“UNIQUE”约束。


“时间戳”的问题在于大量并发操作,它在特定时间范围内不会是唯一的;您可以使用微秒并在末尾添加一些随机数 - 这会有所帮助。

【讨论】:

    【解决方案2】:

    我不会推荐它,因为有可能在同一秒内下达两个订单。使用默认增量并通过固定数字添加/减去 ID,以便用户看到更大的数字。

    $ID = $_GET['ID'];
    $ID -= 183727; // subtract offset
    // Do mysql stuff
    // Build an ID for an URL
    $ID += 183727;
    echo 'http://../test.php?order=' .$ID;
    

    【讨论】:

      【解决方案3】:

      更强大的解决方案是使用 PHP 的 uniqid() 函数。它隐藏了您系统中的订单数量,但如果同时有两个或更多订单出现,它也不会崩溃。

      至于实际问题:不,使用 unix 时间戳作为半随机事件的唯一 ID 是不安全的,例如用户下订单。不管它多么不可能,既然可以很容易地避免,为什么还要留下碰撞的可能性呢?

      【讨论】:

        猜你喜欢
        • 2014-01-16
        • 2011-11-19
        • 1970-01-01
        • 2011-11-21
        • 2012-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-13
        相关资源
        最近更新 更多