2009-06-02 117 views
11

虽然我意识到这通常与跨站点脚本攻击有关,但我想知道的是会话如何在属于单个域的多个子域中保持有效(例如:用户仅登录一次,并且能够使用同一会话访问subdomain1.domain.com和subdomain2.domain.com)。我想我首先需要了解它是如何工作的,但到目前为止,我还没有找到太多与此相关的东西。跨域Cookie访问(或会话)

但是再次,也许我没有问正确的问题。

感谢提前:)

回答

0

您可以为特定的域设置cookie。

在php中,setCookie()方法包含一个参数,您可以在其中指定顶级域,因此该cookie对所有子域均有效。根据你的标签,我看到你在asp.net工作。这大概也存在ASP ...

对于ASP小的搜索后:

试试这个:

Response.Cookies("CookieName").Domain = ".mydomain.com" 

或阅读this

+0

看标签的伴侣。 – Shoban 2009-06-02 12:42:52

+1

euhm,我没有...否则,我不会写'基于你的标签'... – Fortega 2009-06-02 12:46:52

18

INPROC会话不能保持有效,但是你可以编写您的Web应用程序以允许跨多个子域的Cookie。您将需要设置等于域:

Response.Cookies("CookieName").Domain = ".mydomain.com" 

Remember the period.

2

默认情况下,网站的所有cookie在客户端上存储在一起,和所有Cookie与任何请求发送到服务器现场。换句话说,网站中的每个页面都会获取该网站的所有Cookie。饼干的范围

  1. 限制到服务器上的文件夹,它可以让你的Cookie限制到站点上的应用程序:但是,您可以设置Cookie的范围在两个方面。
  2. 将范围设置为域,该域允许您指定域中的哪些子域可以访问cookie。

您可以了解更多here

1

有关为域设置的cookie的评论允许子域接收该cookie会给你方,但缺少的是会话的一致性。

我认为这非常类似于在服务器场中的服务器之间维护状态的问题,并且解决方案可能确保您的会话存储在两个站点之间保持一致(如果它们不是来自同一'网站'在IIS中)。您可以将会话存储移动到SQL Server(HOW TO: Configure SQL Server to Store ASP.NET Session State)中,这可能有助于实现这一目的,因为每个站点在查找与其提供的cookie相关的会话数据时都会查询同一商店。

我希望能让你走上正轨。

6

有很多方法可以跨域共享会话数据或cookie数据。最简单的方法是通过共享数据存储在服务器端共享它。但是如果这么简单,你不会问这个问题。

另一种做这件事的方法同样简单。域one.com包含一些会话数据,如name=aleemid=123,并希望将其传递给two.com。它会遵循以下步骤:

  1. 拨打电话到two.com/api/?name=aleem&id=123
  2. two.com通过查询参数得到的数据,创建一个与数据的cookie。这个cookie将被存储在two.com域名下。
  3. two.com然后将重定向到在这种情况下发生的REFERERone.com

这是一个简单的场景。域two.com需要能够信任one.com而不仅仅是,但它需要知道该请求是真实的,而不仅仅是由用户精心制作的,所以您需要使用公钥/私钥来缓解这个问题。

1

如果你必须建立一个共同的子域的能力,你可以这样做:

在您的子域的html文件,包括在顶部像这样的JavaScript文件:

<script src="http: //common.domain.com/check.asp"></script> 

在检查.asp的,寻找你LOGGED_IN的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。