当我们从Spring OAuth授权服务器请求授权时,the server stores the authorization request that contains clientId and scopes in the session如果用户仍需要批准该请求。
接下来,我们转发到confirm_access
页面,该页面向用户显示某种形式,用户可以批准或拒绝该请求。在用户做出决定后,the request from the session is continued to be used并且我没有看到任何检查会话中的授权请求是否可能在此期间发生了变化。在DefaultUserApprovalHandler
的情况下,如果ApprovalStoreUserApprovalHandler
approve the request由于此审批处理程序的性质而被检查,则用户只会at least the scopes提出任何请求,但不会客户端ID。
所以我担心的是,当用户盯着批准屏幕并且考虑他是否应该批准或拒绝该请求时,会话中的授权请求发生变化,因此用户将在不知不觉中批准一些随机请求。在最好的情况下,这是因为用户打开另一个浏览器选项卡并启动第二个请求。在最坏的情况下,在此期间发生XSS攻击,因此攻击者获得随机批准,而不是用户实际想要批准的内容。
当然这很容易修复,只是ApprovalHandler的一个包装器,它需要scope和client_id作为请求参数,并将它们与会话相匹配,这将解决XSS问题,并使这只是一个小的可用性问题。但是我错过了什么内置的东西来防止这种行为?为什么请求首先存储在会话中?为什么不将params传递给confirm_access视图,而后者又将它们作为URL params传递给approveOrDeny(当然需要受CSRF令牌保护)。