Rails 最好的安全会话存储?

Posted

技术标签:

【中文标题】Rails 最好的安全会话存储?【英文标题】:Rails best session storage for security? 【发布时间】:2014-06-14 17:21:12 【问题描述】:

我正在尝试设置我的会话以在服务器上运行,但不知道如何去做。我已经搜索了一段时间,但找不到可以帮助我设置非 cookie 会话的资源。我在某处看到 SessionStore 将其存储在服务器上而不是客户端上,但我找不到任何关于它的信息。(它是如何工作的或如何设置的)有人可以帮我清理一下吗?

【问题讨论】:

【参考方案1】:

我知道跟踪使用您网站的用户的三种方法:使用数字证书的 cookie 和 HTTPS 连接以及无 cookie 会话。

无 Cookie

即使在 HTTPS 连接下,无 cookie 的味道也像是不安全的,因为您需要以某种方式将标识符(这将是“常规”会话中的 cookie)传递给服务器,通常在您的地址调用中,如下所示:

http://www.somewebsite.com/page.aspx?sid=jrkwojeqrojq3op349023231234r23rf2

您应该检查this question 和this one 的安全隐患。

还可以查看 this one 解释如何通过 javascript 实现这一点。

HTTPS 和证书

HTTPS 连接方法涉及用户在每次请求时向服务器出示他/她的证书。考虑到用户在向服务器发出的每个请求时都会出示证书,因此可以完全避免会话,因为您将对每个请求进行透明的身份验证。

我认为如果不让用户生成并提供证书,就不可能实施这种方法。这不是通常的“仅服务器证书”HTTPS 方法。

Cookies

考虑到您可能不愿意使用 HTTPS 路径,唯一可以识别它是调用另一个操作的浏览器的方法是让它返回一个 cookie 以绑定到会话。您可能无法在没有 cookie 的情况下保持会话并使其免受伪造或其他方面的保护。

底线:浏览器必须向您发送一种将浏览器请求与正在进行的会话联系起来的方法,因此您可以确定(假设您正在加密您的连接)它就是它所说的那个人。

会话由服务器控制,发出的每一个cookie都记录在一个会话表中,所以当持有该cookie的浏览器再次调用时,它可以被服务器查询和识别。

在我之前链接的一个答案中,其中一个答案描述了一种将所有用户信息保存在 cookied 中的方法,因此无需查询服务器上的会话数据库来识别请求浏览器。但这似乎与您的要求有些不同。

Ruby On Rails

Rails 会话方法在 the Rails Security Guide 中进行了描述。

Rails API 的ActionDispatch::Session 将列出 Rails 为会话信息提供的存储机制。

ActionDispatch::Session::CookieStore 是“无服务器”会话存储,因此您拥有服务器识别浏览器发送的会话所需的所有信息,在 cookie 中。这很可能是您在问题中的意思。

但这并不比在服务器端存储会话信息更安全,例如使用 ActionDispatch::Session::CacheStore 或其他保存会话信息的方式。但它的速度要快得多。

底线:使用基于 cookie 的会话时,存储方法的不同之处在于访问和响应时间,而不是安全性。

如果您想使用安全性,我建议使用 HTTPS 证书进行无会话,但这对于大多数普通公共 Web 应用程序来说是不可行的。

【讨论】:

以上是关于Rails 最好的安全会话存储?的主要内容,如果未能解决你的问题,请参考以下文章

Rails:如何在会话中存储数据?

会话存储在 Rails 中的啥位置?

在 Rails 的会话中存储对象

Rails 会话存储模型对象

Rails Guides - Ruby on Rails 安全指南

Ruby on Rails 中的会话如何工作?