Поделиться куки с другими доменами

Я знаю, что можно разрешить другим доменам считывать cookie нашего домена, если они являются поддоменами одного и того же родительского домена.

Например, intranet.abc.com а также extranet.abc.com разрешить чтение файлов cookie друг другом, указав свойство домена для .abc.com

Теперь мне действительно нужно, чтобы я мог разрешить другим доменам считывать cookie моего домена (они не являются поддоменами одного и того же домена). Я искал много дискуссий в Интернете => все говорят"НЕТ"из-за проблем безопасности. Я не уверен, что пропустил какое-то решение, потому что в этом случае я не вижу проблем с безопасностью. Мой сервер однозначно разрешает чтение этого файла cookie доменом XYZ.COM, поскольку файл cookie не содержит конфиденциальной информации, а домен XYZ.COM является моим доверенным доменом,

По моему мнению, должен быть способ указать список других доменов, которым разрешено чтение определенного файла cookie в нашем домене, так же как и CORS, сервер может решить, должна ли информация быть доступной некоторым доверенным доменам.

Скажите, пожалуйста, возможно ли это без использования обходного пути, и если да, то как это сделать? Если это невозможно, я действительно хотел бы знать, почему.

Некоторая информация о том, что я реализую:

Я осуществляю загрузку файлов, и на стороне клиента мне нужно определить, завершена ли загрузка, периодически проверяя наличие маркера загрузки в файле cookie с использованием интервала в javascript.

Логика текущей системы, над которой я сейчас работаю, может хранить файлы на 2 разных серверах. Если файл отсутствует на текущем сервере, он загрузит файл на другой сервер (другой домен)

Большое спасибо.

2 ответа

Вы можете читать файлы cookie вне домена, открыв iframe на специально оснащенной странице в другом домене и используя API window.postMessage для связи между окнами. Только HTML5, очевидно.

Несколько упростим API PostMessage для краткости, обратитесь к страницам разработчиков 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 читалось и передавалось на ваш домен как форма отправки.

Допустим, ваш домен - yours.com, а на странице yours.com/page1 вы задали какое-то значение cookie.

Теперь xyz.com, другой домен хочет это значение. xyz.com/somePage, перенаправляет на yours.com/spl (вместе с параметром страницы, чтобы отправить пользователя, чтобы сказать xyz.com/somePage2), теперь yours.com/spl получает cookie через JavaScript, а затем перенаправляет на xyz.com / somePage2 передает значение cookie в качестве параметра POST или GET.

Полный рабочий образец на http://sel2in.com/pages/prog/html/acrossSites/make.php (с простым веб-сервисом)

AJAX не пример не будет работать, но может сделать это с помощью iframes.

Код:

coki.js (заходит на первый сайт, который хочет выставить куки)

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, получает значение cookie C1 или другого файла cookie с сайта 1 через wsa.php, используя iframe. wsa.php считывает секретный ключ авторизации и имя куки-файла из его параметров, затем вызывает функцию 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>
Другие вопросы по тегам