跨域iframe导致cookie(Rails)出现问题

时间:2015-03-20 15:48:15

标签: ruby-on-rails iframe cookies

我们最近为客户创建了一个电子学习课程,并计划很快将其部署到生产中。 他们有自己的网络服务器和自己的域名,但我们希望我们在我们服务器上运行的Rails驱动的LMS上托管课程。

课程很长,因此需要注册才能随时暂停和恢复。

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

这当然会导致会话出现问题,因为第三方Cookie等等。我已经调查并发现了大量不同的黑客和解决方案,但到目前为止还没有任何工作。

  1. 据我所知,P3P - 标题已不再使用,但我添加了一个虚拟标题,类似于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的图片,但这还不够,或者另一个黑客已被修复。

  4. 据我所知,阻止第三方Cookie通常是阻止用户跟踪的好方法。打算参加该课程的人来自世界各地,并解释如何禁用每个人的第三方cookie阻止不是一种选择。

    我考虑的另一件事是从客户端指向我们的服务器course.foo.com或类似的东西获取子域,并且从那里请求数据的iframe将起作用。我想知道它是否会先行,然后再尝试通过。

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

    我可以完全控制我们的服务器,如果需要,可以更改大部分内容。对于客户端服务器,我只能访问HTML。

    编辑:刚刚注意到至少在IE9中,它可以正常使用P3P标题。

2 个答案:

答案 0 :(得分:4)

最安全的方法是在您的客户的子域名上运行您的应用程序'域名,即。 course.foo.com。

P3P从未获得太多认可; "首先与网站沟通" - 你提到的部分3)可能是指Safari loophole that has since been closed

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

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

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

    Rails.application.config.session_store :cookie_store, 
                                           key: '_course_session',
                                           domain: 'foo.com'
    
  3. 默认情况下,Rails会将Cookie域设置为course.foo.com,这与foo.com不同。但反过来也是如此 - 通过将Cookie域设置为foo.com,它可以与每个子域(例如www.foo.comcourse.foo.com)相同且来源相同。

    但是,有一个潜在的安全考虑因素:您的课程应用Cookie现在可供您的客户使用'现有网站也是如此,因此安全问题现在也可能会损害您的应用会话Cookie。

答案 1 :(得分:0)

您是否在其他域中添加了以下标头:

'Access-Control-Allow-Origin:*'

或idealy只设置源的域。 如果您阅读我的评论,似乎您想要传递存储在Cookie中的变量,那么为什么不使用基于用户唯一键的加密并通过GET传递数据:

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

当然,您已经考虑过安全性,并且不允许人们操纵此网址来利用您的程序。