【发布时间】:2012-01-31 07:33:24
【问题描述】:
我有一些使用 OpenID 进行身份验证并将会话存储在 cookie 中的 Ruby Web 应用程序。有一些 API 和 AJAX 相关的东西我的 Ruby 框架并不适合,所以我有一些 node.js 服务。问题是,如果有人知道我的 AJAX 服务的 URL,那么他们基本上就会向公众开放。目前,这些服务对 Origin 标头进行简单检查,但显然这很容易伪造。
所以我希望能够限制登录到运行的“主”服务的用户访问运行在 Node(或 Python,或基于非 Rack 的 Ruby 服务或其他任何服务)上的服务基于机架的 Web 应用程序。有没有关于如何完成这类事情的约定?我见过大量网站通过example.com 提供内容和页面,然后通过api.example.com 进行AJAX 调用,所以我很惊讶这是我没有读过的内容。
我确实对如何做到这一点有一个想法,我希望得到一些反馈,说明我是否遗漏了一些令人眼花缭乱的显而易见的东西,这使得这不安全:
我的 Ruby Web 应用程序使用 OpenID 进行身份验证,并使用 Rack::Session 将会话存储在会话 cookie 中。通过查看Rack::Session 源代码,我的框架似乎经历了这个过程:
- 生成我的用户对象的 Marshal 转储
- 根据密钥生成 Marshal 的 SHA1 哈希
- 将 SHA1 哈希的十六进制摘要存储在 cookie 中
所以理论上我可以有一个预先安排的密钥或系统来生成密钥,或者通过安全通道在框架之间传递一些消息以共享密钥。然后我可以在任何其他希望能够验证会话数据的框架中反转加密过程。当然,为了跨语言兼容性,我必须摆脱第一步,只存储 JSON 数据或其他东西而不是 Ruby 对象。
假设共享密钥的协议适当安全,这是否被认为是一种安全的做事方式?
【问题讨论】:
-
您的机架服务器将会话存储在数据库中,并将 id 放入 cookie。您的节点服务器所要做的就是从 cookie 中读取 id,在数据库中查找会话并检查该会话是否被授权。
-
真的是这样吗?从这里查看源代码rack.rubyforge.org/doc/Rack/Session/Cookie.html 它是所有客户端存储 - 因此加密,我想。对于像 Rack 这样轻量级的东西,持久化数据库不会出现性能问题吗?并打破跨服务器负载平衡?
-
实际上,我想我可能误读了您的评论,因为您暗示它已经以这种方式工作,而不是我以这种方式实现它。我考虑过这一点,但问题是我遇到了可伸缩性问题,必须使该数据库在负载平衡的虚拟服务器上持久存在,并且不得不担心保护这些数据库。另外,cookie 中的伪造 ID 似乎没有任何安全措施?
-
有什么原因不能在两个框架之间实现一个安全的、相互验证的通道吗?像相互认证的 SSL 之类的东西?然后,当对您的 AJAX 服务的请求进入时,只有来自您的 Ruby 应用程序的请求才会被接受。