为避免该漏洞,必须以某种方式对每个请求进行身份验证并验证身份验证。这相当于提供会话 cookie,无论您是在 GET URL 中执行,例如
domain.com/details/1234
1234
您的用户(以及他的会话)在哪里,或者在 POST 或 JSON 请求中。
在上面,您有身份验证,但没有经过验证。任何人都可以声称自己是用户 1234。
您可以添加一个单独的 cookie,它仍然会公开用户 ID:
domain.com/details/1234:db81390fb2befd1dd839c37ab39d699cddb8d65b
或者你把所有东西都打包在 cookie 中:
domain.com/db81390fb2befd1dd839c37ab39d699cddb8d65b/details
上面的优点是您可以在检查请求后在内部重写请求
domain.com/details/1234
这样安全层“后面”的应用程序就可以保持不变。
安全层将提取 cookie,验证它是否有效(它可以包含自己的加密签名和随机数,以避免重放攻击),并从与 cookie 相关的会话中恢复用户 ID 1234 并将其传递。
第一次进行身份验证时,会生成一个新会话并将其关联到 cookie。如果您使用“足够大”的 cookie,则可以对其添加随机化:
1. The mobile app requests the user details:
domain.com/db81390fb2befd1dd839c37ab39d699cddb8d65b/details
2. The server destroys cookie db813... and replies with JSON:
{
'cookie': '926c8a7699c367d3da9370f433189a20b06f8f3d',
...other details...
}
3. The next request will have to contain cookie 926c8... to be accepted.
在上述场景中,您可以通过向应用程序添加状态感知来进一步加强安全性。例如,当您收到上述 JSON 时,移动应用程序处于“显示详细信息”状态,并且在该状态下,只允许非常有限的转换次数。例如,您可能无法从那里一步转换到“更改用户密码”屏幕。
这意味着如果攻击者能够拦截 JSON 请求,并尝试使用它来访问更改密码功能:
domain.com/926c8a7699c367d3da9370f433189a20b06f8f3d/newpassword
它可以被认定为非法过渡。该newpassword
方法将“看到”先前的状态不是“用户配置文件”或“安全菜单”而是“显示详细信息”,这不是密切相关的,然后可以中止连接。
然后,攻击者必须首先从 Details 转换到 Main Menu,然后从那里转换到 User Profile,从而重新生成 cookie 一次或两次,从而切断合法用户。合法用户应用程序不知道其状态现在不同步,并且可能会尝试使用其拥有的 cookie。这种cookie 重用可以被检测到,并作为 cookie 被故意截取的证据。您将无法可靠地判断谁是攻击者和谁是受害者,但您可以中止这两个连接。