2017-04-14 85 views
1

Laravel Socialite有一个“无状态”模式,禁止将任何内容存储到会话中。从源代码读取它不会做任何不同的事情 - 它只是不存储或检索这些值。Laravel Socialite处于“无状态”模式 - 安全隐患?

作为其中的一部分,例如,其中的assumes例如OAuth状态总是有效的。

检查这是Twitter sign-in documentation告诉我们要做的事情之一。

所以我想知道使用Socialite的无状态模式会有什么样的安全隐患。

如果问题严重,那么对于作为无状态API运行的应用程序,会有什么样的解决方法?我可以将商品存储在其Redis商店中,但我不确定如何将任何信息绑定到当前用户。通过重新实现Socialite的功能,我可以将状态存储在缓存中,并通过用户的IP和浏览器指纹的一些散列键入。但这似乎很混乱。

+0

看看这个视频30:19:https://vimeo.com/138774235,从这里的幻灯片:https://www.slideshare.net/alvarosanchezmariscal/stateless-authentication-with-oauth-2 -jwt-javazone-2015 无状态API的状态检查不再那么不安全,只是采取了不同的措施 – Cyril

+0

@ tech1000,我已经理解并在用户登录后使用JWT。这不是什么问题是关于。这个问题是关于Laravel Socialite提供的登录流程。用户尚未获得授权,因此在此过程中尚未具有访问令牌。 – tremby

+0

Laravel提供的状态检查不会以任何方式影响OAuth授权本身的安全性。用户仍然被重定向到第三方以便登录(通过HTTPS),并接收安全且经过验证的访问资源服务器的AccessToken + RefreshToken。 你提到:<<用户还没有授权,因此还没有在此过程中访问令牌。 >> 国家总是检查授权之后发生的,因为随机字符串钉入到会话的OAuth成功后,才,这是一个措施后,没有一个不可或缺的原因。 – Cyril

回答

-1

作为其中的一部分,它假定OAuth状态始终为 有效。

从技术上讲,这是不准确的。它不认为状态是正确的,它不检查它,因为它不存在。

状态变量非常简单,是一个随机字符串(Str::random(40)),它是在初始授权过程中生成并存储在会话中的。

https://github.com/laravel/socialite/blob/c4e4337e5b70149fdbefbb95b2c9e93d0749c413/src/Two/AbstractProvider.php#L143

每当一个新的请求到来时,检查HTTP请求和服务器会话存储之间,看是否“国家” PARAM匹配。

但是,当您的客户端不使用应用程序会话时,无需检查。

在这种情况下,系统的安全性归结为使用访问令牌。这些令牌是自我验证的,因为它们由具有共享密钥的服务器签名。

每次客户端发出请求时,都会通过头中的Access Token发送请求。

GET /resource HTTP/1.1 
    Host: server.example.com 
    Authorization: Bearer mF_9.B5f-4.1JqM 

所以这是无状态只有在这个意义上,Laravel应用对客户没有会话存储,但自己做客户端需要保持此令牌才能在保持登录状态。只有

Laravel的会话确认确保登录的会话用户和给定的令牌之间存在对应关系,但它不会为令牌本身添加任何安全性。

+0

称为“hasValidState”实际上没有任何检查的函数(因为,正如你所说,没有什么可以检查的)并且假设状态是有效的,返回“假”对我来说是完全一样的。了解访问令牌如何工作;这不是问题所在。我问的是,如果我们没有检查每次调用应用程序服务器时是否存在同一用户,是否会在登录流程中引入任何安全隐患。 – tremby

+0

OAuth会话的安全性取决于AccessToken的安全性,这是一种难以猜测的随机字符串。 同样,当你有一个REST API,你需要用户发送他们的API KEY在请求,而不是传统的登录+会话机制。 这个假设的REST API的安全性取决于API密钥的熵。对于OAuth来说,如果AccessToken中的熵足够高,则采用任何后续措施(如应用程序状态检查)是事后考虑,而不是主要防御机制。 您的AccessToken中的高熵,您的应用程序将会很好。 – Cyril

+0

我仍然不认为你正在回答这个问题。 – tremby