在我的职业生涯中,我已经进行过几次讨论。在我看来,在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。
答案 0 :(得分:2)
我没有看到任何安全原因可以在您的API中公开纯数据库ID。 如果您的数据库暴露了,您无论如何都会迷路。默默无闻的安全性永远不是解决方案。
但是,还有其他一些需要考虑的原因:
公开数据库ID将创建与数据库的耦合。想象一下合并来自不同数据库的数据(共享相同的架构),或将备份数据应用于已在使用的数据库。不能保证相同的ID仍然可用。
设计适当的基于资源的API要求您公开通用唯一ID(UUID)或技术组合键,原因很简单,因为没有其他方法可以确保不同系统/数据库之间的唯一性。
答案 1 :(得分:2)
这不是安全问题,但是它使用户知道有关公司数据大小的一些信息。某些公司不希望公开此类信息
答案 2 :(得分:2)
顺序主键存在一些问题:
来源:改编自 Django 1.11 的两勺
答案 3 :(得分:0)
通过公开API用户的ID,如果某人可以创建一个新用户,然后调用您的用户API,他可以自动知道您的数据库中有多少用户,而在许多企业中,这不是那种您希望您的同意知道的信息。