2011-02-05 67 views
7

我想在用户在PHP中注册后,从一个域创建一个cookie。并使该Cookie可访问其他4个不属于子域的域。我知道cookies并非设计为可供其他域访问。例如,我从域www.firstdomain.com设置了Cookie变量$ user_email,并希望在www.seconddomain.com,www.thirddomain.com等其他域中访问它。可以使用PHP或JavaScript完成此操作。请任何想法。针对多个域名的PHP Cookie

谢谢!

回答

6

正如您所说的,只能为来自该域(包括其子域)的域设置cookie。如果您的域名不共享超级域名,则需要分别为每个域名设置每个Cookie。

您可以使用脚本在每个为您设置cookie的域上执行此操作。但请确保对这些脚本的请求进行身份验证,以便只有您可以设置Cookie。如果你想不同的领域内访问的cookie所以这可以用JavaScript技巧的帮助下完成

https://code.google.com/p/mudoco/

1

我已经解决了完全相同的问题(实际上也适用于4个域)。我想出的唯一解决方案是,在'成功登录页面'中包含3个隐藏的iframe,这些iframe只加载www.domain1.com/register_session.php,www.domain2.com/register_session.php等。 ...

至于register_session.php参数我用“SID”,这包含会话ID:

session_id($_GET['sid']); 
session_start(); 

这实际上是保持会话的存活在所有这些领域,但同样会为你的情况与饼干。

+0

或者,您可以通过[CORS]创建一个跨源AJAX请求(http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross -origin-resource-sharing /)来跨域传递信息。 – 2011-02-05 13:15:25

9

当搜索 有效饼干Cookie列表中,cookie是 从该网址将成为 牵强 主机互联网域名所作出的 域属性的比较。如果存在尾部匹配,则 则该cookie将通过匹配的路径 查看是否应该发送。 “尾部匹配”表示将域 属性与主机的完全限定域名 的尾部 进行匹配。 “acme.com”的域属性为 将与主机名 “anvil.acme.com”以及 “shipping.crate.acme.com”匹配。只有在指定域中的主机 可以为某个域设置一个 Cookie,并且域必须至少有两个(2)或三个(3) 周期以防止域名为“.com”,“。 edu“和”va.us“。 任何在 之一内失败的域名,下面列出的七个特殊顶级域名 只需要两个句点。 其他域名至少需要 三。七个特殊顶级域名为:“COM”,“EDU”,“NET”, “ORG”,“GOV”,“MIL”和“INT”。

域的默认值是 生成cookie响应的服务器的主机名。

阅读here

您可以从主机加载iframe,然后使用编码后的cookie值(在#后面)重新加载自身。

然后,您可以从父窗口访问document.location属性(命中唯一可访问的内容)。解码并将其传递给服务器,执行ajax请求。

这看起来可能如此。

xss.php(位于cookies.example。com):

<?php 
$data = array(
'uid' => $_COOKIE['uid'], 
'loginhash' => $_COOKIE['loginhash']); 
header('Location: xss.php#'.urlencode(json_encode($data))); 

对于这种特殊情况它不需要是hashtag!它只适合其他情况。这也可以在JavaScript中完成。

其他网站嵌入xss.php:

<iframe id="cookies" src="http://cookies.example.com/xss.php"></iframe> 

you need to somehow delay the following of do it in a loop that stops after 5 seconds or something. 

if(document.getElementById('cookies').location != 'http://cookies.example.com/xss.php') { 
// read location, extract hashtag, json decode using javscript, there you have your user. send it to server for validation or whatever. 
} 

这teqnique被称为XSS recieving。例如它被所有的javascript连接库用于facebook。

一个可能更好的方法是像openid这样的令牌交换协议。

亚马逊也使用它。

您可以设置一个openid提供程序(有可用的librarys可以实现此功能),并将其设置为在没有用户交互的情况下自动重定向。我经常看到openid协议用于其他用途,就像跨域通信一样。

+0

你可以编辑你的答案(也许给一个样本代码),所以我可以重新upvote你?我意外地解开了我的赞同。 – 2011-02-05 13:16:56

+0

快来吧。 – 2011-02-05 13:19:20

+0

我认为它可以用更优雅的方式完成,但原理保持不变 – 2011-02-05 13:29:27

1

我已经做了一些脚本来处理多域cookie。由于cookie可以在同一个域内访问。

  1. 在您的第一个域上使用JavaScript在用户浏览器上创建cookie。

  2. 通过使用window.name,将窗口的名称设置为要携带到另一个域的cookie的任何值。

  3. 步骤2应该在创建cookie的域的每个页面上执行。可以通过在所有页面上调用JavaScript文件轻松完成。

  4. 当你移动到另一个域,并且想要访问上面提到的cookie值时,使用window.name作为window没有改变。

  5. 在此域上创建新cookie并将此值赋予它。

0