Cookies - 跨多个域设置
Posted
技术标签:
【中文标题】Cookies - 跨多个域设置【英文标题】:Cookies - set across multiple domains 【发布时间】:2012-01-14 10:57:55 【问题描述】:我公司的设置如下:
subdomain1.domain1.com subdomain2.domain1.com subdomain3.domain1.com subdomain4.domain1.com subdomain5.domain1.comsubdomain6.domain1.com
subdomain1.domain2.com
subdomain2.domain2.com subdomain3.domain2.com subdomain4.domain2.com subdomain5.domain2.com subdomain6.domain2.com请记住,在每个站点上,每个子域可以有一百个站点,用户可以登录。作为开发人员,我们必须跨多个浏览器测试前端,但有些工作可能只需要在登录后的某个部分进行.
我编写了一个用户脚本,它使我们能够保存用户名和密码(以及其他由于机密性而无法提及的细节)。该脚本通过填写登录表单并单击提交按钮来检查用户帐户是否存在。如果没有,它会为我们注册 - 从而使注册过程自动化。
在同一域的子域之间共享 cookie 很容易。如果我在 subdomain1.domain1.com 上,我可以保存一个 cookie,它可以由 subdomain2.domain1.com 检索。但是,我也想将这些保存在 domain2 中。我似乎无法让它工作。
我可以从这里看到两个解决方案 - 要么:
1) 使用用户脚本附加 iFrame,它会在 domain2 上加载站点。然后使用查询字符串来决定设置什么,或者;
2) 使用带有 method="POST" 的表单,并简单地发布到每个域上的文件。
无论哪种方式都将占用大量资源,尤其是在每次 cookie 更改时更新 cookie 的情况下。我们还设置了 URL 屏蔽。所以我们还必须考虑 abc.clientdomain1.com、abc.clientdomain2.com 等网站。
有谁知道实现这一目标的更简单方法?
【问题讨论】:
【参考方案1】:出于安全原因,网站无法在其他域上设置或检索 cookie。通过 javascript 编写表单提交脚本可能是最简单的操作,并且仍会将您需要的 cookie 存储在浏览器缓存中。
【讨论】:
不幸的是,这正是我所担心的;这将是很多工作,但我认为实施这一点将是非常有益的。在我接受这个答案之前,我会等待看看是否有其他人找到了更简单的方法。【参考方案2】:专门为您的 cookie 创建一个公共域并将其用作 getter/setter API。
http://cookie.domain.com/set/domain1
http://cookie.domain.com/get/domain1
http://cookie.domain.com/set/domain2
http://cookie.domain.com/get/domain2
等等。
【讨论】:
这听起来可以 - 不确定是否要这样做,或者表单是否更易于实施,基于我的目标是在一周内完成。 我知道这真的很老了,但你能详细说明一下这个答案吗?它是如何工作的? @BastiSkaldendudler 它只是从 cookie 策略中删除浏览器的 url,因此浏览器在处理 cookie 时只知道cookie.domain.com
。基本上可以像使用广告营销网络一样处理它,您希望在其中跨域跟踪共享 cookie。【参考方案3】:
包含来自 domain2 的脚本标签,该标签使用用户名和散列密码设置 cookie:
<script type="text/javascript" src="http://domain2.com/cookie_login_page.php?username=johnsmith&hash=1614aasdfgh213g"></script>
然后您可以检查以确保散列密码匹配(一种方式)。
重点:
通过在对字符串进行哈希处理之前附加一个服务器同意的时间戳(例如,16:00、16:10 等),使 URL 中的哈希值具有时间敏感性。如果您使用的是 HTTPS,则问题不大。
如果您的密码已经过哈希处理,假设两台服务器上的盐值相同,对密码进行双重哈希处理不会有什么坏处。
示例 PHP 代码:
源代码:
<script type="text/javascript" src="/cookie_login_page.php?username=<?php echo $username; ?>&hash=<?php echo md5($password . date('H')); ?>"></script>
目的地:
<?php
$password = get_password($_GET['username']);
if($_GET['hash'] == md5($password . date('H'))
// set the cookie
【讨论】:
这在很多方面都是错误的。 1) 如果您有一个使用双重哈希密码的端点和一个用于输出单个哈希密码的 php 脚本,那么您最好保持密码不经过哈希处理。即使单哈希密码数据库泄露,使用双哈希的端点仍然可以使用。 2)本质上,您要求使用基于<script>
标签的GET请求在不同的端点上重新登录用户【参考方案4】:
此答案与我对“Set cookie on multiple domains with PHP or JavaScript”问题的答案略有不同。
做 Google 正在做的事情。创建一个 PHP(或任何其他服务器语言文件)文件,在所有 3 个域上设置 cookie。然后在要设置登录的域上,创建一个 HTML 文件,该文件将加载在其他 2 个域上设置 cookie 的 PHP 文件。示例:
<html>
<head></head>
<body>
Please wait..........
<img src="http://domain2.com/setcookie.php?user=encryptedusername"/>
<img src="http://domain3.com/setcookie.php?user=encryptedusername"/>
</body>
</html>
然后在 body 标签上添加一个 onload 回调。仅当图像完全加载时,即在其他 2 个域上设置 cookie 时,文档才会加载。加载回调:
<head>
<script>
function loadComplete()
window.location="http://domain1.com";//URL of domain1
</script>
</head>
<body onload="loadComplete()">
现在 cookie 设置在 三个 域上。
Source
【讨论】:
我如何知道谷歌正在做这件事? @chanchal118 在登录您的 Google 帐户时使用开发者工具检查页面 嗨,Subin,Google 试图通过这种技术解决什么问题,或者他们试图达到什么目的? @SillyDude 当用户登录 Google 时,它会在 youtube.com 等非 .google.com 域上登录同一用户。我认为他们仍然使用它,在登录 Google iirc 时在页面源中找到它【参考方案5】:正如其他人所说,您不能跨域访问 cookie。但是,如果您可以控制服务器代码,则可以在正文中返回信息,并允许您的客户端在每个服务器上读取和存储该信息。
在我的例子中,我将一个客户端连接到多个服务器,并为每个服务器维护一个经过身份验证的连接。我需要知道每个会话何时到期,所以身份验证服务返回 cookie,加上它修改响应的主体以发回相关数据,以便我可以读取该数据并设置我自己的 cookie .
通过这样做,我可以手动跟踪我需要的内容。并非在所有情况下都有效,但可能适用于像我这样的人。
【讨论】:
以上是关于Cookies - 跨多个域设置的主要内容,如果未能解决你的问题,请参考以下文章
ASP.Net WebAPI与Ajax进行跨域数据交互时Cookies数据的传递