当设置了限制性的引用者策略时,第三方JavaScript访问document.location?

0sgqnhkj  于 2023-03-28  发布在  Java
关注(0)|答案(1)|浏览(102)

referrer policy限制了在请求上设置Referer头的时间,如果允许设置头,则限制了引用URL的哪些部分可用。这是对用户的隐私考虑。如果我在一个网站上,我跟随一个链接到另一个网站,我可能不希望另一个网站知道是哪个特定页面推荐了我(甚至是哪个网站推荐了我)。
页面上通常有第三方JavaScript,代码本身可能会发出请求。例如,有相当多的广告网络跟踪像素。发布者将这些代码放置在几乎所有的页面上。跟踪像素通常是1x 1 GIF的GET请求;有时候是身体很大的柱子。
其他CSP可以控制JavaScript允许执行的内容。我本以为Referrer-Policy也会限制JavaScript可以访问的数据。特别是,我本以为具有限制性Referrer-Policy的页面会阻止非源JavaScript访问(或详细访问)来自document.location的数据。
但事实并非如此。
例如,访问https://www.penguinrandomhouse.com/books/referencearchive link)。它从TikTok加载一个跟踪像素。你会看到像素JavaScript对https://analytics.tiktok.com/api/v2/pixel做了一个POST。正如预期的那样,请求上是一个referer: https://www.penguinrandomhouse.com/,因为父页面上有Referrer-Policy: strict-origin;它缺少/books/reference路径。但是,POST的正文是:

{
  "event":"Pageview",
  "message_id":"messageId-1679954283495-7969080450692-C4SGAO96H18A0MH1EN5G",
  "event_id":"",
  "is_onsite":false,
  "timestamp":"2023-03-27T21:58:03.495Z",
  "context":{
    "ad":{"sdk_env":"external","jsb_status":2},
    "user":{"anonymous_id":"CXAXbvf3x_YpEzw4PhoPlJ6MGBI"},
    "pixel":{"code":"C4SGAO96H18A0MH1EN5G"},
    "page":{
      "url":"https://www.penguinrandomhouse.com/books/reference",
      "referrer":"https://www.penguinrandomhouse.com/"
    },
    "library":{"name":"pixel.js","version":"2.1.33"},
    "device":{"platform":"pc"},
    "session_id":"45a166a9-ccea-11ed-9ebf-08c0eb4a4ce6::NaPDjdJMkNgtY5tnReSS-C4SGAO96H18A0MH1EN5G",
    "pageview_id":"pageId-1679954283473-2599747993441-C4SGAO96H18A0MH1EN5G",
    "variation_id":"test_3",
    "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"
  },
  "_inspection":{},
  "properties":{}
}

这显然有引用页面的整个URL。我的问题是:为什么浏览器不阻止它呢?这似乎是推荐人政策的一个明显漏洞。
这是一个更好的问题https://security.stackexchange.com/

yzckvree

yzckvree1#

页面上通常有第三方JavaScript
我本以为带有限制性Referrer-Policy的页面会阻止非源JavaScript访问(或详细访问)来自document.location的数据。
您可能会将此与same-origin policy的情况混淆,same-origin policy可以防止不同的源代码相互访问。加载<script src="…">的JavaScript在<script>元素的源代码上下文中运行,而不是与加载它的URL对应的上下文。(反之则是一个更大的安全问题,实际上。)没有必要阻止这种JavaScript访问特定的属性,如document.location,因为它有完全的权限来进行相同的操作-origin请求并访问页面的内容,并且没有真实的的分离JavaScript基于它首先从哪里加载(如果你从cdnjs.com加载jQuery,你是否被允许做$('<a href>').prop('href')?)。
简而言之:一旦加载,就没有“第三方JavaScript”的区别,并且阻止所有第三方JavaScript会破坏Web。

相关问题