使用 jsonp 跨域获取 cookie 值不适用于 IE

问题描述 投票:0回答:1

我在使用 jsonp 从域 A 到域 B 获取 cookie 信息时遇到问题。我已经让它适用于 Chrome 和 Firefox 等,但对于 IE 不起作用。我正在从域 B 向域 A 发送一个 jsonp 请求,通过域 A 上的 php 设置一个 cookie,然后我再次检查来自 B 的相同 cookie。然后 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;

检查.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."');";
}

域名B:

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>
php internet-explorer cross-domain jsonp p3p
1个回答
0
投票

最后,这一切都归结为向脚本添加 p3p 策略标头。为此,我使用了 facebook 使用的 p3p hack:

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

需要注意的重要一点是,我认为 P3P 可以让您访问另一个域上的 cookie。这并不完全正确。您只能访问同样使用 P3P 标头设置的 cookie。我的实时设置有点复杂,在某些情况下,cookie 是在没有 P3P 的域 A 上设置的,而不是通过辅助域(如我的示例中的 B)。在这种情况下,我无法读取域 B 的 cookie。

我更改了上面的示例以反映解决方案。当然,请将文本更改为适当的内容,并确保您不会意外使用与紧凑代码等效的单词(例如 LAW、NON 等)。

就我而言,我可以这样做,因为我们只在客户端存储信息,我们甚至不知道它是什么。我们不存储任何数据。

© www.soinside.com 2019 - 2024. All rights reserved.