你最喜欢的跨域cookie分享方法是什么?
我看到iframe / p3p技巧是最受欢迎的技巧之一,但我个人不喜欢它,因为JavaScript +隐藏的字段+框架真的使它看起来像一个黑客的工作。 我也遇到了使用Web服务进行通信的主从方法( http://www.15seconds.com/issue/971108.htm ),这似乎更好,因为它对用户是透明的,并且对不同的浏览器也是强大的。
有没有更好的方法,每个方法的优缺点是什么?
我的方法是将一个域指定为“中心”域,将其他任何域指定为“卫星”域。
当有人点击“login”链接(或提供一个持久的logincookie),login表单最终将其数据发送到中央域的URL,以及一个隐藏的表单元素,说明来自哪个域为了方便起见,以后用户redirect)。
然后,中央域的这个页面继续设置一个会话cookie(如果login进行的很好),并redirect到用户login的任何域,并在URL中为该会话特有的特殊生成的令牌。
卫星URL的页面然后检查该标记以查看它是否对应于为一个会话生成的标记,如果是,则redirect到它本身而没有标记,并设置本地cookie。 现在卫星域也有一个会话cookie。 这个redirect从URL中清除了令牌,所以用户或者任何爬虫都不可能logging包含该令牌的URL(尽pipe如果他们这样做,应该没关系,令牌可以是单次使用的令牌)。
现在,用户在中央域和卫星域都有一个会话cookie。 但是如果他们访问另一个卫星呢? 那么,通常情况下,他们会觉得卫星是未经authentication的。
但是,在我的应用程序中,只要用户处于有效会话中,其他卫星域上所有页面的链接都会附加一个?或者&s。 我保留这个'查询string的意思是“检查中央服务器,因为我们认为这个用户有一个会话”。 也就是说,任何HTML页面上都不会显示任何令牌或会话ID,只会显示无法识别某人的字母。
如果没有有效的会话,那么接收这样一个's'查询标签的URL将会redirect到中心域名,说“你能告诉我这是谁的吗? 通过把东西放在查询string中。
当用户到达中央服务器时,如果他们通过身份validation,那么中央服务器将只收到他们的会话cookie。 然后它将用另一个使用令牌将用户送回卫星,卫星将在login后像卫星一样对待卫星(见上文)。 也就是说,卫星现在将在该域上build立一个会话cookie,并redirect到它本身以从查询string中移除该标记。
我的解决scheme没有脚本或iframe支持。 它需要将'?s'添加到用户可能还没有在该URL的cookie的任何跨域URL。 我想到了解决这个问题的一种方法:当用户首次login时,在每个域上设置一个redirect链,在每个域上设置一个会话cookie。 我没有实现这一点的唯一原因是,这将是复杂的,你需要能够有一个设置的顺序,这些redirect将发生在什么时候停止,并会阻止你扩大超过15个域左右(太多了,你变得危险地接近许多浏览器和代理的“redirect限制”)。
如果您完全控制了所有域的后端,这是一个很好的解决scheme。 在我的情况下,我只有一个客户端(JavaScript / HTML)控制,另一个完全控制,因此我需要使用iframe / p3p方法,这将吸收:(。
在那篇文章中的例子似乎对我来说是可疑的,因为你基本上redirect到一个url,而这个url又将查询string中的variables传回给你的域。
在这个例子中,这意味着恶意用户可以简单地导航到http://slave.com/return.asp?Return=blah&UID=123 “并以用户123的身份login到slave.com。
我是否遗漏了一些东西,或者是否知道这种技术是不安全的,不应该被用于像这个例子那样的事情(传递用户标识的东西,大概是为了使自己的身份变得可移植)。
@thomasrutter
你可以避免pipe理卫星上的所有出站链接(通过附加“查询string”),通过在页面加载时进行ajax调用来检查“中央”域的身份validation状态。 您可以通过每个会话只有一个来避免多余的调用(在后续页面加载中)。
在加载页面之前进行authentication检查请求服务器端可能会更好,这样(a)你可以更有效地访问会话,并且(b)你将在页面呈现时知道用户是否login并相应地显示内容)。
我们使用Cookie链接,但这不是一个好的解决scheme,因为当其中一个域名对用户不起作用时(由于过滤/防火墙等原因),它会中断。 较新的技术(包括您的)只有在执行cookie /pipe理login的“主”服务器中断时才会中断。
请注意,您的return.asp可能会被滥用以redirect到任何网站(请参阅此例)。
好吧,我似乎find了一个解决scheme,你可以创build一个脚本标签,加载你想要设置/获取cookie的域的src …到目前为止,只有safari似乎不能设置cookie,但是Ie6和FF工作正常…如果你只想获取cookies,这是一个非常好的方法。
您还应该根据域b,c,d来validation活动会话信息。这样,只有当用户已经login到域a时,才能login。
你所做的是在域名接收variables你检查引用地址,以及你可以确认链接是从你自己的域名,而不是简单地input地址栏中链接的人。 这种方法运作良好。