我们最近为客户创建了一个电子学习课程,并计划很快将其部署到生产中。 他们有自己的网络服务器和自己的域名,但我们希望我们在我们服务器上运行的Rails驱动的LMS上托管课程。
课程很长,因此需要注册才能随时暂停和恢复。
现在,他们还希望用户访问他们的域名,foo.com,浏览并启动课程。然后,课程启动器页面会将我们的页面嵌入到app.bar.com的iframe中。
这当然会导致会话出现问题,因为第三方Cookie等等。我已经调查并发现了大量不同的黑客和解决方案,但到目前为止还没有任何工作。
据我所知,P3P
- 标题已不再使用,但我添加了一个虚拟标题,类似于Facebook和Google。 (P3P: CP="This site does not have a p3p policy."
)
我也调查了CORS
,Access-Control-Allow-Credentials: true
听起来很有希望,但什么也没做。我可能错误配置了它,但想在投入太多时间之前知道它是否完全可能。
有些网站提到,如果浏览器之前已与app.bar.com
进行了通信,那么它会有效,所以我尝试在iframe之前加载来自app.bar.com
的图片,但这还不够,或者另一个黑客已被修复。
据我所知,阻止第三方Cookie通常是阻止用户跟踪的好方法。打算参加该课程的人来自世界各地,并解释如何禁用每个人的第三方cookie阻止不是一种选择。
我考虑的另一件事是从客户端指向我们的服务器course.foo.com
或类似的东西获取子域,并且从那里请求数据的iframe将起作用。我想知道它是否会先行,然后再尝试通过。
除了确保将Cookie设置并发送到我们的LMS之外,大多数其他JavaScript解决方案似乎都假设不需要域之间的任何通信。
我可以完全控制我们的服务器,如果需要,可以更改大部分内容。对于客户端服务器,我只能访问HTML。
编辑:刚刚注意到至少在IE9中,它可以正常使用P3P标题。
答案 0 :(得分:4)
最安全的方法是在您的客户的子域名上运行您的应用程序'域名,即。 course.foo.com。
P3P从未获得太多认可; "首先与网站沟通" - 你提到的部分3)可能是指Safari loophole that has since been closed。CORS不适用于您的情况。如果您想要从客户父框架与课程网站进行交互,那将是相关的,例如。发出AJAX请求或加载字体等资源。
因此,如果您希望用户代理将cookie视为第一方Cookie,
将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.com
或course.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]">
当然,您已经考虑过安全性,并且不允许人们操纵此网址来利用您的程序。