我正在创建一个用户可以登录或注册的项目,但我刚刚发现了一个安全漏洞。
首先让我讲一下用户从服务器收到令牌时的流程,
用户可以注册或登录,如果所有验证都正确,则服务器将响应:
{
"meta": {
"issueDate": 1592078419167,
"expToken": "10800000"
},
"payload": {
"user": {
"id": 3,
"email": "new3@gmail.com",
"username": "new3"
},
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MywiZW1haWwiOiJuZXczQGdtYWlsLmNvbSIsInVzZXJuYW1lIjoibmV3MyIsImlhdCI6MTU5MjA3ODQxOSwiZXhwIjoxNTkyMDg5MjE5fQ.cjLgQjc2QbIhgumG2X2VsLk70c58F7NrKboYL2F2Sa0"
}
}
Authorization: 'bearer TOKEN'然后使用该令牌,他可以通过将其作为模式附加到标头中来执行 CRUD 操作。使用令牌后,服务器中的中间件会检查它是否被篡改或过期(我在这里使用 JWT),如果它已过期或被篡改,那么服务器会使用401 unauthorized.
我注意到的是这个。可以说我有桌子USERS和POSTS(1:N)。User1 有 2 个 id 分别为 1 和 2 的帖子,然后另一个用户注册,我们称他为 User2,User2 注册成功收到一个令牌然后转到终端使用 curl,发送一个api/post/1/edit他不拥有的路由请求。这是我的问题。了解互联网/API 工作原理的用户可以获取令牌并访问任何资源。
我想到的解决方案很少。
创建一个中间件,通过查询数据库来检查用户是否拥有资源。但我不认为这是一个高性能的解决方案,因为我必须在不同的控制器上查询并执行它,比如 users_controller、posts_controller、another_controller。
我将使用 UUID 而不是递增 ID,因此每当他们尝试访问帖子编辑路线时,他们都无法轻松找出 ID。像
api/post/1akA13124S5129/edit<--- 这很难弄清楚。
PS:我在Facebook上试过,但它不起作用。我认为他们有很多令牌和cookies。顺便说一句,我现在不会在任何请求中使用/包含任何 cookie。