【问题标题】:PHP Cookies for multiple Domains多个域的 PHP Cookie
【发布时间】:2011-06-21 20:53:54
【问题描述】:

一旦用户在 PHP 中注册,我想从一个域创建一个 cookie。并使此 cookie 可访问 4 个其他域而不是子域。我知道 cookie 的设计目的不是让其他域可以访问。例如,我从域 www.firstdomain.com 设置了一个 cookie 变量 $user_email,并希望在 www.seconddomain.com、www.thirddomain.com 等其他域中访问它。这可以使用 PHP 或 JavaScript 来完成。请有什么想法。

谢谢!

【问题讨论】:

    标签: php cookies dns


    【解决方案1】:

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

    作为 register_session.php 的参数,我使用包含会话 ID 的“sid”:

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

    这实际上是为了在所有这些域上保持会话活动,但对于您使用 cookie 的情况也是如此。

    【讨论】:

    • 或者,您可以通过 CORS 发出跨域 AJAX 请求以跨域传递信息。
    【解决方案2】:

    在 cookie 列表中搜索 有效的 cookie,比较 cookie 的域属性是 用互联网域名制作的 URL 将来自的主机 获取。如果有尾匹配, 然后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)));
    

    对于这种特殊情况,它不需要是主题标签!它只是方便其他情况。这也可以在 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.
    }
    

    此技术称为 xss 接收。例如,它被 facebook 用于他们所有的 javascript 连接库。

    一种可能更好的方法是某种令牌交换协议,例如 openid。

    亚马逊也使用这个。

    您可以设置一个 openid 提供程序(有可用的库可以开箱即用)并将其设置为自动重定向回来,无需用户交互。我经常看到 openid 协议用于其他用途,例如跨域通信。

    【讨论】:

    • 您能否编辑您的答案(也许提供一段示例代码),以便我重新投票给您?我不小心取消了我的投票。
    • 我认为它可以用更优雅的方式完成,但原理保持不变
    • 这实际上是一种从另一个域接收数据的非常聪明的方法。以后我一定要牢记在心。
    【解决方案3】:

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

    您可以使用在每个域上为您设置 cookie 的脚本来执行此操作。但请确保对这些脚本的请求进行身份验证,以便只有您可以设置 cookie。

    【讨论】:

    【解决方案4】:

    我已经编写了一些脚本来处理多域 cookie:

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

    【讨论】:

    • 非常酷,今天晚些时候试一试,把它扔到 GitHub 上,我会贡献的
    【解决方案5】:

    如果您想访问不同域中的 cookie,那么这可以借助 javascript 技巧来完成。因为cookie可以在同一个域内访问。

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

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

    3. 应在已创建 cookie 的域的每个页面上执行第 2 步。可以通过在所有页面上调用 JavaScript 文件来轻松实现。

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

    5. 在此域上创建新 cookie 并将此值分配给它。

    【讨论】:

      猜你喜欢
      • 2011-05-05
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 2011-04-30
      • 2013-11-01
      • 2011-10-08
      • 2017-08-21
      • 1970-01-01
      相关资源
      最近更新 更多