【问题标题】:Share cookies with other domains与其他域共享 cookie
【发布时间】:2014-01-08 08:45:26
【问题描述】:

我知道可以允许其他域读取我们的域 cookie,只要它们是同一父域的子域

例如intranet.abc.comextranet.abc.com可以通过将域属性指定为.abc.com来允许cookie被对方读取

现在,我真的需要允许其他域读取我的域 cookie(它们不是同一域的子域)。我在互联网上搜索了很多讨论 => 都说 “NO” 由于安全问题。我不确定我是否错过了解决方案,因为在这种情况下我没有看到任何安全问题。我的服务器明确允许此 cookie 被 XYZ.COM 域读取,因为 cookie 不包含任何敏感信息,并且 XYZ.COM 域是我信任的域, p>

在我看来,应该有一种方法可以指定允许读取我们域中特定cookie的其他域列表,就像CORS一样,服务器可以决定信息是否应该可用于某些受信任的域。

请告诉我是否可以不使用解决方法,如果可以,该怎么做? 如果不可能,我真的很想知道为什么。

关于我正在实施的一些信息:

我正在实现文件下载,在客户端,我需要通过使用 javascript 中的间隔定期检查 cookie 中的下载令牌来检测下载是否完成。

我目前正在处理的当前系统的逻辑可能会将文件存储在 2 个不同的服务器中。如果当前服务器中缺少该文件,它将在另一个服务器(另一个域)中下载文件

非常感谢。

【问题讨论】:

    标签: javascript web-applications cookies


    【解决方案1】:

    您可以拥有一个与第三方共享 cookie 内容的后端 Web 服务,但是您的服务器必须在会话中保存 cookie 值并具有与其他网站共享的会话 ID。

    还可以特殊页面和重定向,以便读取 cookie 值并将其作为表单提交传递到您的域。

    假设您的域是 yours.com,并且在 yours.com/page1 页面上设置了一些 cookie 值。

    现在 xyz.com ,另一个域想要那个值。 xyz.com/somePage,重定向到 yours.com/spl(连同页面参数发送用户说 xyz.com/somePage2),现在 yours.com/spl 通过 JavaScript 获取 cookie,然后重定向到 xyz.com /somePage2 将 cookie 值作为 POST 或 GET 参数传递。

    http://sel2in.com/pages/prog/html/acrossSites/make.php 的完整工作示例(带有简单的 Web 服务)

    AJAX 不是示例不起作用,但可以使用 iframe。

    代码:

    coki.js(在第一个想要公开 cookie 的站点上)

    function setCookie(cname,cvalue, daysExpire)
    {
    var d = new Date();
    d.setTime(d.getTime()+(daysExpire * 24 * 60 * 60 * 1000));
    var expires = "expires=" + d.toGMTString();
    document.cookie = cname + "=" + cvalue + "; " + expires + " ; path=/ ;"
    }
    
    function getCookie(cname)
    {
    var name = cname + "=";
    var ca = document.cookie.split(';');
    for(var i=0; i<ca.length; i++)
      {
      var c = ca[i].trim();
      if (c.indexOf(name)==0) return c.substring(name.length,c.length);
      }
    return "";
    }
    

    wsa.php(在站点 1 上)。为了使其更安全,可以检查调用页面/容器 URL 并使用动态密钥。

    <html>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <?php
    
    error_reporting(E_WARNING);
    $d = $_REQUEST['s'];
    if($d != "secret565"){
        echo "Bad secret bye";
        return;
    }
    
    $n = $_REQUEST['n'];
    if($n == ""){
        echo "No cookie name, bye";
        return;
    }
    
    
    
    ?>
    
    <script src=coki.js>
    </script>
    <script >
    
    
        n = '<?php echo "$n"?>'
        v = getCookie(n)
        //alert("For " + n + ", got :" + v + ".")
        window.parent.gotVal(n, v)
    
    
    
    </script>
    

    getc.html

    进入站点 2,使用 iframe 通过 wsa.php 从站点 1 获取 cookie C1 或其他 cookie 的值。 wsa.php 从其参数中读取秘密 auth 密钥和 cookie 名称,然后调用包含页面中的 javascript 函数以传回值

        <form name=f1 action=ws.php method=post>
    <h1>Get cookie from Javascript sample </h1>
    http://sel2in.com/pages/prog/html/acrossSites/
    <table>
    
    <tr><td>Url from <td/><td> <input name=u1  value='wsa.php' size=100><td/></tr>
    
    <tr><td>Cookie Name <td/><td> <input name=n  value='C1'><td/></tr>
    
    <tr><td>Secret <td/><td> <input name=s value='secret565'><td/></tr>
    
    
    <tr><td><input type=button value='Go' onclick='s1do()' > <td/><td><td/></tr>
    
    </table>
    
    
    </form>
    
    <div id = result>result here</div>
    
    <div id = cc1>container</div>
    
    
    v 2 c
    <script>
    function gotVal(n, v){
        document.getElementById("result").innerHTML = "For " + n + ", got :" + v + "."
    }
    
    function s1do(){
        document.getElementById("cc1").innerHTML = ""
        n1 = document.f1.n.value
        s1 = document.f1.s.value
        url = document.f1.u1.value
        qry = "s=" + escape(s1) + "&n=" + escape(n1)
        s = "<iframe border=0 height =1 width=1 src=\"" + url + "?" + qry + "\" ></iframe>"
        document.getElementById("cc1").innerHTML = s
    }
    
    </script>
    

    【讨论】:

    • 感谢您的回答,我用更多信息更新了我的问题。我需要使用 javascript 在客户端读取 cookie。
    • 如果你想要在javascript中,那么你可以通过ajax调用同一个页面并获取值
    • 也添加了 javascript 版本
    • 非常感谢您的努力,我非常感谢,但这并不能解决我的问题。
    【解决方案2】:

    您可以通过打开一个 iframe 到另一个域上专门检测的页面并使用 window.postMessage API 在窗口之间进行通信来读取域外 cookie。显然只有 HTML5。

    为了简洁起见,稍微简化了 postMessage API,请参阅 MDN 开发人员页面以获取完整详细信息。 https://developer.mozilla.org/en-US/docs/Web/API/Window.postMessage

    <iframe id="ifrm" src="http://other.domain.com/getCookie.html"></iframe>
    <script>
        var iframe = document.getElementById('ifrm');
    
        window.addEventListener('message', function (e) {
             if (e.source === iframe.contentWindow && e.origin === 'other.domain.com') {
                 var cookie = e.data;
                //do something with cookie
             }
    
         }); 
        //wait for the iframe to load...maybe ping it first...then
        iframe.contentWindow.postMessage('give me the cookie:cookie name', 'other.domain.com');
    </script>
    
        /* in getCookie.html */
    
    <script>
        window.addEventListener('message', function (e) {
            if (e.origin === 'your.domain.com') {
                 var soughtCookie = /give me the cookie\:(.*)/.exec(e.data)[1];
                 // read the cookie
                 var cookie = getCookieFn(soughtCookie)
                 e.source.postMessage(cookie.toString(), 'your.domain.com');
            }
        }, false);
    </script>
    

    【讨论】:

      猜你喜欢
      • 2016-05-18
      • 2016-08-16
      • 1970-01-01
      • 2013-08-14
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      相关资源
      最近更新 更多