代码之家  ›  专栏  ›  技术社区  ›  HostileFork says dont trust SE

浏览器是否可以响应XSS jquery.getJSON()请求中在头中指定的Cookie?

  •  0
  • HostileFork says dont trust SE  · 技术社区  · 14 年前

    (注:这是我问题的后续 Can jQuery.getJSON put a domain's cookies in the header of the request it makes? 并涵盖了 Setting a cookie in an AJAX request? )

    有人告诉我,我无法使用 $.cookie(..., ..., {domain: ...}) . 但是在对我最后一个问题的回复的评论中,@zanlok说“服务器的回复,但是,绝对可以设置一个cookie”,它得到了两张赞成票。

    所以我想我应该尝试使用一个服务,这个服务是为设置名为 Freebase's "touch" API . 电话看起来像:

    $.getJSON("http://api.sandbox-freebase.com/api/service/touch",
    {}, // URL parameters
    afterCookieIsSetCallback); // Callback function
    

    在FireBug中查看响应头,如下所示:

    Date    Wed, 24 Nov 2010 03:35:28 GMT
    Server  Apache
    X-Metaweb-Cost  [...]
    Etag    [...]
    Expires Wed, 24 Nov 2010 03:35:29 GMT
    Cache-Control   no-store
    Vary    Accept-Encoding
    Content-Encoding    gzip
    Set-Cookie  mwLastWriteTime=1290569730|10325_9202a8c04000641f80000000199eff96|sandbox; expires=Thu, 25-Nov-2010 03:35:28 GMT; Path=/
    Last-Modified   Wed, 24 Nov 2010 03:35:28 GMT
    Content-Length  134
    Content-Type    text/plain; charset=utf-8
    X-Cache MISS from cache01.sandbox.sjc1.metaweb.com
    Connection  keep-alive
    X-Metaweb-TID   cache;cache01.sandbox.sjc1:8101;2010-11-24T03:35:28Z;0001
    

    所以肯定有一个集合Cookie,脚本运行响应处理程序。但是,对于此脚本向其发出的稍后JSON请求,请求头中不存在cookie .sandbox-freebase.com .

    (相比之下,只需在地址栏中键入touch api URL并以这种方式加载它,就可以为将来的请求设置cookie。这甚至适用于其他选项卡。)

    这似乎与先前的“预期行为”有所不同,因为MetaWeb大约在“2007-2009”发布了一个工具包,该工具包似乎认为这种方法可行:

    http://www.google.com/codesearch/p?hl=en#v099O4eZ5cA/trunk/src/freebase/api.js&q=touch%20package:http://mjt%5C.googlecode%5C.com&l=340

    在不太了解它的情况下,我想知道这是否是最近Firefox采用的一个更改,然后WebKit也随之采用。也许这里提到的那个:

    http://trac.webkit.org/browser/trunk/WebCore/xml/XMLHttpRequest.cpp#L856

    那么有没有关于这个特定问题的规范性文档呢?

    2 回复  |  直到 7 年前
        1
  •  4
  •   Mark At Ramp51    14 年前

    您正在进行的AJAX调用向顶级url(地址栏中的url)域之外的域发出请求。这将导致它成为第三方cookie,默认情况下,Internet explorer不会保留第三方cookie。这意味着cookie将在第一个请求时返回到Set cookie头中,但是您向该服务器发出的后续请求将不会在请求中发送该cookie。

    就像你说的,如果你直接转到浏览器中的url,它就可以工作了。这是因为在这种情况下,它是第一方饼干。

    为了让IE接受第三方cookie,发送 SET-COOKIE 其响应上的头,还必须设置P3P策略头。

    下面是一个例子,当你导航到CNN时,你会注意到它对b.scorecardresearch.com域名的一个请求,scorecardresearch正在删除一个跟踪cookie,但是这个cookie被认为是第三方cookie。因此,为了使其工作,他们还必须包括 p3p 标题,请参阅下面的标题:

    HTTP/1.1 200 OK
    Content-Length: 43
    Content-Type: image/gif
    Date: Thu, 02 Dec 2010 19:57:16 GMT
    Connection: keep-alive
    Set-Cookie: UID=133a68a4-63.217.184.91-1288107038; expires=Sat, 01-Dec-2012 19:57:16 GMT; path=/; domain=.scorecardresearch.com
    P3P: policyref="/w3c/p3p.xml", CP="NOI DSP COR NID OUR IND COM STA OTC"
    Expires: Mon, 01 Jan 1990 00:00:00 GMT
    Pragma: no-cache
    Cache-Control: private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
    Server: CS
    

    如果要复制此头并将其添加到响应中,您会注意到cookie已开始工作,

    P3P: policyref="/w3c/p3p.xml", CP="NOI DSP COR NID OUR IND COM STA OTC"
    

    最好为您的业务设计一个特定的P3P头,但是上面的内容应该可以用于测试目的。

        2
  •  1
  •   icyrock.com    14 年前

    如果我正确理解您的意思,您会想知道服务器为什么要发送 Set-Cookie 只有在第一次请求时。如果这是真的,那么这是设计的-看看这里:

    设置Cookie 就像一个setter-服务器将其发送给浏览器以在本地缓存它。它可以每次发送,但不需要这样做,所以只有在需要更改本地存储的值时,它才会再次发送。

    另一方面,浏览器将发送 Cookie 每次使用上次发出的内容设置的标题 设置Cookie 从服务器。