3

(注意:另见相关问题Can browsers react to Set-Cookie specified in headers in an XSS jquery.getJSON() request?

我似乎无法在 JSON 操作的请求标头中设置 cookie(其名称为mwLastWriteTime)。请求本身是 Freebase MQL 教程中的一个简单请求,否则它工作正常:

// Invoke mqlread and call the function below when it is done.
// Adding callback=? to the URL makes jQuery do JSONP instead of XHR.
jQuery.getJSON("http://api.sandbox-freebase.com/api/service/mqlread?callback=?",
{query: JSON.stringify(envelope)},   // URL parameters
displayResults);                     // Callback function

我希望我可以用以下方式设置这个 cookie:

$.cookie('mwLastWriteTime', value, {domain: ".sandbox-freebase.com"});

不幸的是,在 FireBug 中查看传出请求标头时,我只看到:

Host    api.sandbox-freebase.com
User-Agent  [...]
Accept  */*
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive  115
Connection  keep-alive
Referer [...]

但是,如果我不指定域(或者如果我明确指定请求站点的域),我可以mwLastWriteTime显示在本地请求的标头中。由于.sandbox-freebase.com域拥有这些 cookie,它们不应该与 GET 一起旅行吗?还是需要某种解决方法?

我的代码都是 JavaScript,我想设置这个 cookie,然后立即调用 getJSON。

4

2 回答 2

5

不能设置跨域 cookie,因为这会使浏览器(以及用户)受到 XSS 攻击。

引用我上面引用的QuirksMode.org 文章

请注意,域的目的是允许 cookie 跨子域。我的 cookie 不会被 search.quirksmode.org 读取,因为它的域是 www.quirksmode.org 。当我将域设置为 quirksmode.org 时,搜索子域也可能会读取 cookie。我无法将 cookie 域设置为我不在的域,我无法将域设为 www.microsoft.com 。在这种情况下,只允许 quirksmode.org。

如果您想使用 cookie 值进行跨站点请求,您需要在您控制的服务器上设置一个特殊的代理,这将允许您传递要作为 cookie 值发送的值(可能通过 POST 参数)。您还需要确保妥善保护它,以免您的代理成为“释放”他人私人信息的手段。

于 2010-11-24T01:23:16.183 回答
0

您是否通过 localhost 运行所有测试?你用的是IE吗?如果是这样,它将强制执行其自己的特殊品牌的安全要求,并可能转储您的 cookie。打开 fiddler 并使用http://ipv4.fiddler绕过它。

如果这种类型的诡计没有发生(看起来您正在使用 FireFox),您也可能需要明确地将 cookie 的域设置为与 JSON 请求的域相同。浏览器不会将为域 A 设置的 cookie 发送到对域 B 的请求。不过,我不是 100% 确定是这种情况。

于 2010-11-24T01:22:44.450 回答