Session整合,这种方式安全吗?

Session integration, is this approach secure?

用户使用默认 Laravel 身份验证登录,这会在浏览器中放置一个加密的 cookie,并将会话保存在数据库中。

用户移动到经典 asp 页面,我在其中检查 cookie 值、获取哈希值,然后调用 laravel 应用返回并传递会话 ID 哈希值。

然后我在 laravel 中使用它来查看是否有该 ID 的活动会话,如果是,我 return 为真,因此用户可以登录,在经典 asp.

在经典应用程序中的每个页面请求中,我检查数据库中的 last_updated_time 并在每个页面上更新它。所有登录和注销都在 laravel 中完成,经典依赖数据库来查看会话是否处于活动状态。

我还会调用 public url 来获取会话变量并使用 laravel 添加会话变量,因为它都是加密的并且为此使用经典的 asp努力。

我看到的唯一风险是会话劫持,但我认为它的风险并不比平时高。

锁定 laravel URL 我打电话来检查它是否有效的会话很重要吗?

我是不是遗漏了一个安全漏洞?

我不是安全专家,但我看不出这有什么问题。打包的 Laravel 数据库会话处理程序以相同的方式工作。 cookie 包含引用数据库中记录的散列。会话数据是 base64 编码的,但它既不存在也不存在。我认为您实际上可以避免自己滚动,而只需使用 Laravel 的 DatabaseSessionHandler。

Illuminate/Session/DatabaseSessionHandler

...我只是更深入地阅读了您的问题,并注意到了关于 public URL 设置和检索会话数据的部分。我认为这是一个非常糟糕的主意。主要是因为它将 向最终用户敞开大门,允许他们读取和写入会话数据 。这只能是烂尾了。

就像我上面说的,数据是 base64 编码的,所以我相信您将能够在 [=32= 内解析、读取和写入您满意的内容].

编辑

好的...我认为这是最后一次编辑。数据被 php 序列化,然后进行 base64 编码。 question 看起来可以帮助您实现这一目标。如果没有,并且 API 端点是唯一的方法,找到一些方法来阻止最终用户访问它。

这种方法安全吗?

根据您的陈述,您可能 没有打开任何安全漏洞。 session cookie 本身并未在用户计算机上加密,但您要确保它在他们的计算机和您的计算机之间以及您的每台计算机之间进行了加密。您应确保已设置 Secure Flag 以帮助防止通过传统未加密传输 (HTTP) 意外发送 cookie,但如前所述,这不会影响存储 cookie 本身。

也就是说,您实际上是在劫持您自己的用户 session。虽然现在可能 不会引入漏洞,但您可能会削弱整个系统,这可能会在未来导致漏洞。

有更好的方法吗?

这可能是个愚蠢的问题,但您确定需要 session 吗?如果您在服务器之间处理凭据,听起来更像是您想使用 Access Tokens 并废弃 session.

使用访问令牌类似于使用 sessions,但您需要使您的服务无状态。这意味着您不再将有关登录用户的信息存储在任何特定计算机上,因此每次他们访问需要该信息的服务器时,您都需要从数据库中提取所需的任何内容。

这在长 运行 中是一件好事,因为当您不必太担心 session 的位置和其中的内容时,扩展您的服务会容易得多。

OAuth 2.0 is widely used standard (Facebook, Twitter, Google), and was specifically designed to be easy to use. The RFC is complex, but there's a log of good guides 不用担心。

OAuth 2 的一个轻微缺点(如果您可以这么说的话)是它必须通过加密连接发生。如果您的用例不能保证通过 SSL 或(最好)TLS 进行加密,那么您应该改用 OAuth 1.0 (WITH revision A)。

这是因为 OAuth 2.0 在请求中公开了它的“秘密”令牌,而 OAuth 1.0 只使用它来提供签名哈希。如果您选择这条路线,建议使用其他人的库,因为哈希值非常具体。

进一步改进

(注:此部分是在回答被采纳后添加的)

我最近一直在探索的一个系统是 Json Web Tokens。这些存储有关用户的信息,以保存每台机器在数据库中反复查找的信息。因为令牌是用一个秘密进行哈希处理的,所以您可以确定,只要您的秘密没有暴露,一个有效的令牌就代表一个成功登录的用户,而无需触及数据库。

如果可能,您应该避免在令牌中放置任何过于个人化的内容。如果您必须在令牌中存储私人或秘密信息,您可以对其进行加密,或者您可以使用反向缓存代理将 JWT 交换为传统的安全令牌。乍一看这似乎违背了初衷,但这意味着您的某些服务可能根本不需要数据库访问权限。

除了会话劫持,没有。这是应用程序在内部进行交互的标准方式。当然,如果您选择数据库以外的其他类型的会话存储,例如 Memcached,可能有更好的方法来获取数据。

有几件事可以做。

  • 使频道成为 HTTPS。几乎不可能嗅探您的传输层。
  • 您可以使用 JWT to get this task done. Which will help you to use the existing functionality in your system while connecting with ASP system as well. You can write a small REST web service which allows ASP to connect. You could use this lib. You can refer this article 而不是与您的 cookie 进行交互,这会让您了解应该如何完成。

如果您需要更多信息,请告诉我。