在REST API中将数据库ID公开给客户端是否是一种不好的做法?

时间:2019-06-13 09:02:21

标签: rest security

在我的职业生涯中,我已经进行过几次讨论。在我看来,在REST API响应中向客户端公开数据库中存储的ID是完全可以的。但是与我一起工作的一些人认为这确实是安全方面的第一课:“切勿向客户端公开您的数据库ID。”

然后,它们会提供各种复杂性来避免这种情况。例如,在一项工作中,我必须对其余响应中的每个ID进行哈希处理,然后对请求中的所有ID进行哈希处理。

现在,在我的新工作中,我们有以下模式。一个表具有一个自动递增的“ id”,但是我们没有公开它,在它旁边有一个uuid“ code”,这就是我们向客户端公开的那个。因此,从本质上讲,我们有2个id,它们都存储在数据库中,但是我们可以公开一个,而另一个可以,因为:

“千万不要向客户端公开您的数据库ID。”

这稍微有意义吗?我们仍然向客户公开“标识符”。如果问题在于某人可以看到一个表中有多少行,因为该“ id”是自动递增的,那么我只需将“ id”作为一个uuid,然后将其公开给客户端即可。

如果您查看其他公共Rest API的示例,在我看来,它们似乎公开了数据库ID,没有问题。例如,gitlab:

GET /projects/:id/users

[
  {
    "id": 1,
    "username": "john_smith",
    "name": "John Smith",
    "state": "active",
    "avatar_url": "http://localhost:3000/uploads/user/avatar/1/cd8.jpeg",
    "web_url": "http://localhost:3000/john_smith"
  },
  {
    "id": 2,
    "username": "jack_smith",
    "name": "Jack Smith",
    "state": "blocked",
    "avatar_url": "http://gravatar.com/../e32131cd8.jpeg",
    "web_url": "http://localhost:3000/jack_smith"
  }
]

Twitter: https://api.twitter.com/1.1/statuses/show.json?id={id}

但即使stackoverflow: https://stackoverflow.com/questions/{id} https://stackoverflow.com/users/{id}

我敢打赌,URL 2188707中的https://stackoverflow.com/users/2188707只是我在stackoverflow数据库中的用户ID。

4 个答案:

答案 0 :(得分:2)

我没有看到任何安全原因可以在您的API中公开纯数据库ID。 如果您的数据库暴露了,您无论如何都会迷路。默默无闻的安全性永远不是解决方案。

但是,还有其他一些需要考虑的原因:

  • 公开数据库ID将创建与数据库的耦合。想象一下合并来自不同数据库的数据(共享相同的架构),或将备份数据应用于已在使用的数据库。不能保证相同的ID仍然可用。

  • 设计适当的基于资源的API要求您公开通用唯一ID(UUID)或技术组合键,原因很简单,因为没有其他方法可以确保不同系统/数据库之间的唯一性。

答案 1 :(得分:2)

这不是安全问题,但是它使用户知道有关公司数据大小的一些信息。某些公司不希望公开此类信息

答案 2 :(得分:2)

顺序主键存在一些问题:

  1. 它们会显示您的数量(例如:如果您创建一个对象并且 API 返回 ID 10,001,它会粗略估计您的数据库中有多少此类对象,这可能会引起黑客或竞争)
  2. 黑客可以利用“不安全的直接对象引用”(link)
  3. 黑客可以将其用于 XSS 攻击 (link)

来源:改编自 Django 1.11 的两勺

答案 3 :(得分:0)

通过公开API用户的ID,如果某人可以创建一个新用户,然后调用您的用户API,他可以自动知道您的数据库中有多少用户,而在许多企业中,这不是那种您希望您的同意知道的信息。