我想在用户在PHP中注册后,从一个域创建一个cookie。并使该Cookie可访问其他4个不属于子域的域。我知道cookies并非设计为可供其他域访问。例如,我从域www.firstdomain.com设置了Cookie变量$ user_email,并希望在www.seconddomain.com,www.thirddomain.com等其他域中访问它。可以使用PHP或JavaScript完成此操作。请任何想法。针对多个域名的PHP Cookie
谢谢!
我想在用户在PHP中注册后,从一个域创建一个cookie。并使该Cookie可访问其他4个不属于子域的域。我知道cookies并非设计为可供其他域访问。例如,我从域www.firstdomain.com设置了Cookie变量$ user_email,并希望在www.seconddomain.com,www.thirddomain.com等其他域中访问它。可以使用PHP或JavaScript完成此操作。请任何想法。针对多个域名的PHP Cookie
谢谢!
正如您所说的,只能为来自该域(包括其子域)的域设置cookie。如果您的域名不共享超级域名,则需要分别为每个域名设置每个Cookie。
您可以使用脚本在每个为您设置cookie的域上执行此操作。但请确保对这些脚本的请求进行身份验证,以便只有您可以设置Cookie。如果你想不同的领域内访问的cookie所以这可以用JavaScript技巧的帮助下完成
我已经解决了完全相同的问题(实际上也适用于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();
这实际上是保持会话的存活在所有这些领域,但同样会为你的情况与饼干。
当搜索 有效饼干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协议用于其他用途,就像跨域通信一样。
你可以编辑你的答案(也许给一个样本代码),所以我可以重新upvote你?我意外地解开了我的赞同。 – 2011-02-05 13:16:56
快来吧。 – 2011-02-05 13:19:20
我认为它可以用更优雅的方式完成,但原理保持不变 – 2011-02-05 13:29:27
我已经做了一些脚本来处理多域cookie。由于cookie可以在同一个域内访问。
在您的第一个域上使用JavaScript在用户浏览器上创建cookie。
通过使用window.name
,将窗口的名称设置为要携带到另一个域的cookie的任何值。
步骤2应该在创建cookie的域的每个页面上执行。可以通过在所有页面上调用JavaScript文件轻松完成。
当你移动到另一个域,并且想要访问上面提到的cookie值时,使用window.name
作为window
没有改变。
在此域上创建新cookie并将此值赋予它。
:
或者,您可以通过[CORS]创建一个跨源AJAX请求(http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross -origin-resource-sharing /)来跨域传递信息。 – 2011-02-05 13:15:25