Cross-domain iframe 导致 cookie 出现问题 (Rails)

Cross-domain iframe causes troubles with cookies (Rails)

我们最近为客户完成了 e-learning 课程的创建,并计划很快将其部署到生产环境中。 他们有自己的 web-server 和自己的域,但希望我们在我们的 Rails-powered LMS 运行 服务器上托管课程。

课程较长,需要注册,以便随时暂停和继续。

现在,他们还希望用户访问他们的域,foo.com,浏览并启动课程。课程启动器页面然后将我们的页面嵌入到来自 app.bar.com.

的 iframe 中

这当然会导致 session 出现一些问题,因为 third-party cookies 等等。我已经调查并发现了大量不同的技巧和解决方案,但到目前为止没有任何效果。

  1. 据我了解,P3P-header实际上已经不再使用了,但我添加了一个虚拟的header,类似到 Facebook 和 Google。 (P3P: CP="This site does not have a p3p policy.")

  2. 我还调查了 CORSAccess-Control-Allow-Credentials: true 听起来很有希望,但什么也没做。我可能配置错误,但想在投入太多时间之前知道它是否完全可行。

  3. 一些网站提到,如果浏览器之前已经与 app.bar.com 通信,它就可以工作,所以我尝试在 iframe 之前从 app.bar.com 加载图像,但那不是足够了,或者后来修复了另一个黑客攻击。

我知道阻止 third-party cookie 通常是防止跟踪用户的好方法。打算参加该课程的人来自世界各地,解释如何为每个人禁用 third-party cookie 阻止不是一种选择。

我考虑的另一件事是从客户端获取一个子域指向我们的服务器,course.foo.com 或类似的东西,并且从那里请求数据的 iframe 可以工作。在尝试通过该请求之前,我想知道它是否会先工作。

域之间不需要任何类型的通信,正如大多数其他 JavaScript 解决方案似乎假设的那样,除了确保设置 cookie 并将其发送到我们的 LMS。

我可以完全控制我们的服务器,并且可以根据需要更改那里的大部分内容。对于客户端服务器,我只能有限地访问 HTML.

编辑:刚刚注意到至少在 IE9 中,它可以很好地与 P3P-header.

最安全的方法的确是 运行 您的应用程序位于客户域的子域中,即。 course.foo.com.

P3P 从未获得太多认可;您在 3) 中提到的 "communicate with the site first" 部分可能指的是 Safari loophole that has since been closed.

CORS 不适用于您的情况。如果您想从客户父框架与课程站点进行交互,这将是相关的,例如。发出 AJAX 请求或加载字体等资源。

因此,如果您希望用户代理将 cookie 视为第一方 cookie,

  1. 在 course.foo.com
  2. 上托管网站
  3. config/initializers/session_store.rb中的设置更改为

    Rails.application.config.session_store :cookie_store, 
                                           key: '_course_session',
                                           domain: 'foo.com'
    

默认情况下,Rails 会将 cookie 域设置为 course.foo.com,这与 foo.com 的来源不同。但反过来也行——通过将 cookie 域设置为 foo.com,它可以访问并且与每个子域相同,例如 www.foo.comcourse.foo.com.

虽然这有一个潜在的安全考虑因素:您的课程应用程序 cookie 现在也可用于您客户的现有站点,因此那里的安全问题现在也可能危及您的应用程序会话 cookie。

您是否在其他域上添加了以下 headers:

'Access-Control-Allow-Origin:*'

或者最好只设置源的域。 如果你看了我的评论,似乎你想传递存储在 cookie 中的变量,那么为什么不使用基于用户唯一密钥的加密并通过 GET 传递数据:

<iframe src="http://mywebsite.com?user_id=[id]&user_data=[encrypted_data_goeshere]">

当然你已经考虑到安全性,不允许人们操纵这个url来利用你的程序。