Получение значений файлов cookie между доменами с использованием jsonp не работает для IE

У меня возникли проблемы с передачей информации о файлах cookie из домена А в домен Б с помощью jsonp. У меня это работает для Chrome и Firefox и др., Но для IE это не работает. Я делаю запрос jsonp из домена B в домен A, который устанавливает cookie там через php в домене A, а затем я снова проверяю тот же файл cookie из B. Затем информация в файле cookie выводится на экран (домен A), чтобы я мог взять ее из домена B и установить там файл cookie, отражающий эту информацию (я знаю о рисках безопасности, я не пытаюсь синхронизировать конфиденциальные данные). информация здесь, просто настройка).

Итак, как уже было сказано, это работает в FF, Chrome и т. д. Но в IE я вижу, что возвращаются только файлы cookie сеанса, а установленный мной файл cookie не является (и не должен быть).

Любая подсказка, что здесь не так? Или это даже не возможно? Я также кратко попробовал CORS, но у него та же проблема.

У меня есть следующая тестовая установка:

Домен A: (центральный домен)

логин.php

<?php 
//below line solves the problem. See accepted answer
header('P3P: CP="Facebook does not have a P3P policy. Learn why here: http://fb.me/p3p"');
setcookie("loggedin","5",time()+3600);
echo 1;

check.php

<?php
//below line solves the problem. See accepted answer
header('P3P: CP="Facebook does not have a P3P policy. Learn why here: http://fb.me/p3p"');
$cookies = implode('; ', array_map(function ($v, $k) { return $k . '=' . $v; }, $_COOKIE, array_keys($_COOKIE)));

if(isset($_COOKIE['loggedin'])&&($_COOKIE['loggedin'] == "5")) {
        echo "alert('logged in, ".$cookies."');";
} else {
        echo "alert('not logged in, ".$cookies."');";
}

Домен Б:

jsonp.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
</head>
<body>
<h1>hi!</h1>
<script>
        jQuery.ajax({
                url: 'http://cookies.hidev.nl/login.php',
                dataType: 'jsonp',
                type: "get",
        });
        //note: first call will set the cookie, next succeeds only after reload due to async loading. This is only for test purposes
        jQuery.ajax({
                url: 'http://cookies.hidev.nl/check.php',
                dataType: 'jsonp',
                type: "get"
        });

</script>
</body>
</html>

person jberculo    schedule 09.11.2015    source источник


Ответы (1)


В итоге все это свелось к добавлению в скрипты заголовка политики p3p. Для этого я использовал хак p3p, используемый facebook:

header('P3P: CP="Facebook does not have a P3P policy. Learn why here: http://fb.me/p3p"'); 

Важно отметить, что я думал, что P3P дает вам доступ к файлам cookie в другом домене. Это не совсем верно. У вас есть доступ только к файлам cookie, которые также устанавливаются с заголовком P3P. Моя живая настройка немного сложнее, и в некоторых случаях файлы cookie были установлены в домене A без P3P, а не через дополнительный домен (например, B в моем примере). В этом случае я не смог прочитать куки из домена B.

Я изменил приведенный выше пример, чтобы отразить решение. Конечно, измените текст на что-то подходящее и убедитесь, что вы случайно не используете слова, эквивалентные компактным кодам (например, ЗАКОН, НЕТ и т. д.).

В моем случае я могу это сделать, так как мы только храним информацию на стороне клиента, и даже сами не знаем, что это такое. Мы не храним никаких данных.

person jberculo    schedule 13.11.2015