【发布时间】:2019-10-27 20:10:31
【问题描述】:
在我的职业生涯中,我曾多次讨论过这个问题。在我看来,在您的 REST API 响应中将存储在数据库中的 id 公开给客户端是完全可以的。但与我共事过的一些人认为这确实是安全方面的第一课:“永远不要将数据库 ID 暴露给客户端。”
然后它们会带来各种复杂性来避免这种情况。例如,在一项工作中,我必须对我的休息响应中的每个 ID 进行哈希处理,然后对请求中的所有 ID 进行取消哈希处理。
现在在我的新工作中,我们有以下模式。一个表有一个自动递增的“id”,但我们不公开它,在它旁边我们有一个 uuid“代码”,这就是我们向客户端公开的那个。所以本质上我们有 2 个 id,都存储在数据库中,但一个我们可以公开,另一个我们可以,因为:
“永远不要将您的数据库 ID 暴露给客户端。”
这有点道理吗?我们仍然向客户端公开一个“标识符”。如果问题是有人可以看到我们在一个表中有多少行,因为“id”是自动递增的,我只会将“id”设为 uuid,并将其公开给客户端。
如果您查看其他公共休息 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"
}
]
推特:
https://api.twitter.com/1.1/statuses/show.json?id={id}
但即使是stackoverflow:
https://stackoverflow.com/questions/{id}
https://stackoverflow.com/users/{id}
我敢打赌,网址 https://stackoverflow.com/users/2188707 中的 2188707 只是我在 stackoverflow 数据库中的用户 ID。
【问题讨论】: