跨域 cookie 访问(或会话)
Posted
技术标签:
【中文标题】跨域 cookie 访问(或会话)【英文标题】:Cross domain cookie access (or session) 【发布时间】:2010-10-30 16:04:35 【问题描述】:虽然我意识到这通常与跨站点脚本攻击有关,但我想知道会话如何在属于单个域的多个子域中保持有效(例如:用户只登录一次,并且能够使用同一会话访问 subdomain1.domain.com 和 subdomain2.domain.com)。我想我首先需要了解它是如何工作的,但到目前为止我还没有找到任何相关的东西。
但话又说回来,也许我没有问正确的问题。
提前致谢:)
【问题讨论】:
【参考方案1】:您可以为特定域设置 cookie。
在php中,setCookie()方法包含一个参数,可以在其中指定***域,所以cookie对所有子域都有效。根据您的标签,我看到您正在使用 asp.net。可能这对于asp也存在...
稍微搜索一下asp:
试试这个:
Response.Cookies("CookieName").Domain = ".mydomain.com"
或阅读this
【讨论】:
但是你又编辑了它(?)我第一次看不到第二个代码;-) 当然,无论用于演示的语言如何,任何证明问题的基本要求是可能的答案都是有价值的。你至少知道你应该继续沿着你现在的道路前进。 ;) 您无法获取或设置跨域 cookie。此解决方案行不通。 问题是:“我想知道的是会话如何在属于单个域的多个子域中保持有效”这对我来说看起来并不真正跨域......跨度> 标题为“跨域 cookie 访问(或会话)”。我猜这是模棱两可的。你的答案是对的。我收回了=)【参考方案2】:Inproc 会话不能保持有效,但是您可以对 Web 应用程序进行编码以允许跨多个子域的 cookie。您需要将域设置为:
Response.Cookies("CookieName").Domain = ".mydomain.com"
Remember the period.
【讨论】:
无法在其他域中设置 cookie。它必须在您自己的域下。 标题说明了这一点,但如果您阅读他的要求,他显然会说子域。【参考方案3】:默认情况下,一个站点的所有 cookie 都存储在客户端上,并且所有 cookie 都会与对该站点的任何请求一起发送到服务器。换句话说,站点中的每个页面都会获取该站点的所有 cookie。但是,您可以通过两种方式设置 cookie 的范围:
-
将 cookie 的范围限制为服务器上的一个文件夹,这样您就可以将 cookie 限制为网站上的应用程序。
将范围设置为域,允许您指定域中的哪些子域可以访问 cookie。
您可以了解更多here。
【讨论】:
【参考方案4】:关于为域设置 cookie 以允许子域接收该 cookie 的 cmets 为您提供了这一方面,但缺少的是会话的一致性。
我认为这非常类似于在场中的服务器之间维护状态的问题,解决方案可能是确保您的会话存储在两个站点之间保持一致(如果它们不是来自同一“网站”的服务器) IIS)。您可以将会话存储移动到 SQL Server (HOW TO: Configure SQL Server to Store ASP.NET Session State) 中,这可能会起到这样的作用,因为每个站点在查找与它们所提供的 cookie 相关的会话数据时都会查询同一个存储。
我希望这能让你走上正轨。
【讨论】:
【参考方案5】:有很多方法可以跨域共享会话数据或 cookie 数据。最简单的是通过共享数据存储在服务器端共享它。但如果有那么简单,你就不会问这个问题了。
另一种方法同样简单。域one.com
包含一些会话数据,例如name=aleem
和id=123
,并希望将其传递给two.com
。它将遵循以下步骤:
-
致电
two.com/api/?name=aleem&id=123
当two.com
通过查询参数获取数据时,它会用数据创建一个cookie。此 cookie 将存储在 two.com
域下。
然后two.com
将重定向回REFERER
,在这种情况下恰好是one.com
这是一个简化的场景。域two.com
需要能够信任one.com
,不仅如此,它还需要知道请求是真实的,而不仅仅是由用户制作的,因此您需要使用公钥/私钥来缓解这种情况。
【讨论】:
【参考方案6】:如果你有能力设置一个公共子域,你可以这样做:
在您的子域 html 文件中,在顶部包含一个 javascript 文件,如下所示:
<script src="http: //common.domain.com/check.asp"></script>
在 check.asp 中,查找您的已登录 cookie,如果不存在,则显示一个页面,例如 http://common.domain.com/login.asp 使用类似
<%
if (cookie_not_found)
%>
location.href = "http: //common.domain.com/login.asp";
<%
%>
一旦用户提交用户名密码,将其提交回相同的 login.asp 并设置会话 cookie,(将在 common.domain.com 域中设置)然后重定向到 http://subdomain1.domain.com
。
现在会发生的是,将对嵌入的“common.domain.com/check.asp”进行调用,common.domain.com 的 cookie 将与请求一起由浏览器发送。因此,即使您在 subdomain1.domain.com 中,您也会知道您的会话是否有效。
【讨论】:
【参考方案7】:这是一个可行的解决方案:
http://anantgarg.com/2010/02/18/cross-domain-cookies-in-safari/
【讨论】:
以上是关于跨域 cookie 访问(或会话)的主要内容,如果未能解决你的问题,请参考以下文章