跨域 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=aleemid=123,并希望将其传递给two.com。它将遵循以下步骤:

    致电two.com/api/?name=aleem&id=123two.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 访问(或会话)的主要内容,如果未能解决你的问题,请参考以下文章

JS访问或设置cookie的方法+跨域调用方法

跨域会话 Cookie(Heroku 上的 Express API + Netlify 上的 React App)

C# asp.net 如何跨域获取cookie

cookie在多域名下的跨域解决办法

cookie机制&跨域问题

跨域登录