繁体   English   中英

与其他域共享cookie

[英]Share cookies with other domains

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

例如, intranet.abc.comextranet.abc.com可以通过为.abc.com指定域属性来允许彼此读取.abc.com

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

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

如果没有使用解决方法,请告诉我是否可行,如果是,该怎么做? 如果不可能,我真的想知道原因。

有关我正在实施的内容的一些信息:

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

我目前正在处理的当前系统的逻辑可能将文件存储在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>

您可以拥有一个与第三方共享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从其参数中读取秘密身份验证密钥和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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM