【问题标题】:Is it a bad idea to use a database table's ID as an external API identifier?使用数据库表的 ID 作为外部 API 标识符是不是一个坏主意?
【发布时间】:2012-03-13 07:28:47
【问题描述】:

我们正在设计一个带有外部 API 的 HTTP 服务,该服务需要存储一些项目,外部 API 使用者稍后可能需要检索这些项目。一切都存储在一个表foos 中,目前的计划是只使用表的主ID 键作为外部唯一标识符。我的直觉告诉我这是一个糟糕的设计,但我无法有效地论证我的观点,部分原因是我无法阐明原因。

到目前为止,我能想到的唯一缺点是:

  • 如果我们想更改架构怎么办?我们必须重新填充所有内容以确保其 ID 保持不变,或者在移动期间实施另一个唯一标识符列
  • 轻微(?)安全风险(我知道,通过默默无闻的安全性不安全等)

还有其他主要缺点,还是我只是偏执?还希望有一些链接到已发表的文章讨论这个问题!

【问题讨论】:

    标签: database-design primary-key uniqueidentifier api-design


    【解决方案1】:

    我会继续说,如果您的数据库被锁定,那么这无关紧要,除非:

    • 共享 API 密钥意味着 C.I.A. 的损失。用户信息。
    • 您使用户无需二级身份验证即可轻松调用您的 API。

    我相信您已经意识到,采取措施防止 SQL 注入将阻止任何人利用此信息,但是知道索引范围可能意味着有人会知道索引范围内少 1 或多 1 是用于访问您的 API 的有形密钥。


    例如:

    如果您可以通过 URL 访问您的 API 而无需登录,那么使用索引范围是不好的。
    http://mysite.com?APIkey=145
    如果我知道我的密钥是 145,那么 144 和 146 可能也可以拨打电话。

    使用 GUID 方案是解决此问题的方法,但使用此您正在制作其他 sacrifices:
    ID (index): 145
    ID (GUID) : C87FC84A-EE47-47EE-842C-29E969AC5131


    或者最后,您可以添加另一列以将随机哈希保存为唯一的 API 密钥,如您所说:
    ID(哈希): da39a3ee5e6b4b0d3255bfef95601890afd80709

    【讨论】:

      【解决方案2】:

      我同意你的观点,因为你的第一点:

      如果您最终出于某种原因更改架构,您的服务应该抽象物理更改。维护旧密钥非常困难....

      【讨论】:

        【解决方案3】:

        绝对安全。 id 将与其余数据一起备份和恢复,因此没有问题。也没有我能想到的任何安全问题。是否是糟糕的设计是一个品味问题。

        IIRC eBay 和 PayPal API 以这种方式工作,但我不能对此引用参考。

        【讨论】:

          猜你喜欢
          • 2015-02-07
          • 2011-08-31
          • 2011-02-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多