我无法使用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 :(中央域名)
的login.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."');";
}
域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>
答案 0 :(得分: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等)。
在我的情况下,我可以这样做,因为我们只存储信息客户端,我们甚至不知道它是什么。我们没有存储任何数据。