Laravel Socialite处于“无状态”模式 - 安全隐患?
Laravel Socialite有一个“无状态”模式,禁止将任何内容存储到会话中。从源代码读取它不会做任何不同的事情 - 它只是不存储或检索这些值。Laravel Socialite处于“无状态”模式 - 安全隐患?
作为其中的一部分,例如,其中的assumes例如OAuth状态总是有效的。
检查这是Twitter sign-in documentation告诉我们要做的事情之一。
所以我想知道使用Socialite的无状态模式会有什么样的安全隐患。
如果问题严重,那么对于作为无状态API运行的应用程序,会有什么样的解决方法?我可以将商品存储在其Redis商店中,但我不确定如何将任何信息绑定到当前用户。通过重新实现Socialite的功能,我可以将状态存储在缓存中,并通过用户的IP和浏览器指纹的一些散列键入。但这似乎很混乱。
作为其中的一部分,它假定OAuth状态始终为 有效。
从技术上讲,这是不准确的。它不认为状态是正确的,它不检查它,因为它不存在。
状态变量非常简单,是一个随机字符串(Str::random(40)
),它是在初始授权过程中生成并存储在会话中的。
每当一个新的请求到来时,检查HTTP请求和服务器会话存储之间,看是否“国家” PARAM匹配。
但是,当您的客户端不使用应用程序会话时,无需检查。
在这种情况下,系统的安全性归结为使用访问令牌。这些令牌是自我验证的,因为它们由具有共享密钥的服务器签名。
每次客户端发出请求时,都会通过头中的Access Token发送请求。
GET /resource HTTP/1.1
Host: server.example.com
Authorization: Bearer mF_9.B5f-4.1JqM
所以这是无状态只有在这个意义上,Laravel应用对客户没有会话存储,但自己做客户端需要保持此令牌才能在保持登录状态。只有
Laravel的会话确认确保登录的会话用户和给定的令牌之间存在对应关系,但它不会为令牌本身添加任何安全性。
称为“hasValidState”实际上没有任何检查的函数(因为,正如你所说,没有什么可以检查的)并且假设状态是有效的,返回“假”对我来说是完全一样的。了解访问令牌如何工作;这不是问题所在。我问的是,如果我们没有检查每次调用应用程序服务器时是否存在同一用户,是否会在登录流程中引入任何安全隐患。 – tremby
OAuth会话的安全性取决于AccessToken的安全性,这是一种难以猜测的随机字符串。 同样,当你有一个REST API,你需要用户发送他们的API KEY在请求,而不是传统的登录+会话机制。 这个假设的REST API的安全性取决于API密钥的熵。对于OAuth来说,如果AccessToken中的熵足够高,则采用任何后续措施(如应用程序状态检查)是事后考虑,而不是主要防御机制。 您的AccessToken中的高熵,您的应用程序将会很好。 – Cyril
我仍然不认为你正在回答这个问题。 – tremby
看看这个视频30:19:https://vimeo.com/138774235,从这里的幻灯片:https://www.slideshare.net/alvarosanchezmariscal/stateless-authentication-with-oauth-2 -jwt-javazone-2015 无状态API的状态检查不再那么不安全,只是采取了不同的措施 – Cyril
@ tech1000,我已经理解并在用户登录后使用JWT。这不是什么问题是关于。这个问题是关于Laravel Socialite提供的登录流程。用户尚未获得授权,因此在此过程中尚未具有访问令牌。 – tremby
Laravel提供的状态检查不会以任何方式影响OAuth授权本身的安全性。用户仍然被重定向到第三方以便登录(通过HTTPS),并接收安全且经过验证的访问资源服务器的AccessToken + RefreshToken。 你提到:> 国家总是检查授权之后发生的,因为随机字符串钉入到会话的OAuth成功后,才,这是一个措施后,没有一个不可或缺的原因。 – Cyril