簡體   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