如何与节点共享Laravel会话?

时间:2015-09-12 12:47:18

标签: php laravel laravel-5.1

我正在设置一个socket.io服务器来处理套接字请求。这是在端口1234上运行。这是在laravel 5.1应用程序旁边运行。 Laravel正在使用redis来处理会话。

我有很多关于使用socket.io连接laravel的教程,这一切都非常简单。我可以在套接字和laravel应用程序中连接,响应和转发消息。

但是每个教程都避免了此设置的auth部分。一旦在套接字:1234空间内收到消息,如何在确保请求被授权的同时将该消息转发到laravel。

理想情况下,我只是简单地共享会话,并验证XSRF令牌。由于这两个应用程序位于不同的端口上,因此我无法直接接收会话。

目前我正在使用另一种方法,它涉及以下内容:

  • 在套接字连接(在节点中)时,我使用节点的Crypto库和节点的PHPUnserialise库解密在连接上发送的cookie。
  • 这为我提供了laravel会话ID(来自cookie)
  • 我用它来访问redis laravel会话
  • 然后我解密了那个会话,这反过来让我可以访问用户ID

它有效,但我觉得它可能是一个安全漏洞,因为我实际上并没有使用_token来验证原点。

2 个答案:

答案 0 :(得分:7)

我认为你的代码是正确的,也许是唯一的方法。 session_id通常存储在cookie中,并且在某些时候必须发送到服务器。由于node和php是不同的语言,因此无法直接共享会话。你总是需要一个像redis,mysql或filesystem这样的中间存储。当然还有一种检索会话的方法。检索会话的关键当然是session_id。

关于保护websockets的一篇有趣帖子:

https://www.christian-schneider.net/CrossSiteWebSocketHijacking.html

他建议将随机生成的密钥添加到会话中,以便验证何时建立websocket连接。

session_id本身已经是随机的,但这些session_id通常是长寿命的,因此短暂的随机ID可以提高安全性。短命应该尽可能短:让php将它添加到数据库中,一旦在节点中验证连接,将其从数据库中删除,这样就不能再使用它了。

有许多额外的会话验证技术,例如检查浏览器字符串或将会话固定到一个IP地址:

http://phpsec.org/projects/guide/4.html

我不推荐这些类型的支票,因为它们并没有真正增加额外的安全性,只会让最终用户烦恼。

最重要的是,我认为是:

  • 您使用安全的方式来通信session_id等。这意味着HTTPS
  • 当用户关闭浏览器时,会话应该会过期
  • 如果用户从其他位置连接,或者应该有权访问“登录日志”
  • ,则应通知用户

答案 1 :(得分:0)

大约一年前,我找到了一个很好的解决方案。我决定把它变成一个模块,它非常容易使用。帮助您获得cookie而无需对其进行硬编码。帮助您获取该会话ID并从mysql和redis

中检索它

https://www.npmjs.com/package/node-laravel-session