设置限制性 Referrer-Policy 时第三方 JavaScript 访问 document.location?

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

A referrer policy 限制何时在请求上设置

Referer
标头,如果允许标头,则引用 URL 的哪些部分可用。这是对用户隐私的考虑。如果我在一个网站上,然后通过链接转到另一个网站,我可能不想让另一个网站知道哪个特定页面引用了我(甚至是哪个网站引用了我)。

页面上通常有第三方 JavaScript,并且该代码本身可能会发出请求。例如,广告网络有相当多的跟踪像素。出版商几乎将这些代码放在他们网站的所有页面上。跟踪像素通常是对 1x1 GIF 的 GET 请求;有时它们是具有广泛主体的 POST。

其他 CSP 可以控制允许执行的 JavaScript。我本以为 Referrer-Policy 也会限制 JavaScript 可以访问的数据。特别是,我认为具有限制性 Referrer-Policy 的页面会阻止非源 JavaScript 访问(或详细访问)来自

document.location
.

的数据

但事实并非如此。

例如,访问 https://www.penguinrandomhouse.com/books/reference存档链接)。它从 TikTok 加载一个跟踪像素。 (我不是想在这里挑选 TikTok;该页面上还有很多其他人。)你会看到像素 JavaScript 向 https://analytics.tiktok.com/api/v2/pixel .正如预期的那样,由于父页面上的

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/ 这会是一个更好的问题吗?

javascript content-security-policy websecurity referrer-policy
1个回答
0
投票

页面上通常有第三方 JavaScript

我原以为带有限制性

Referrer-Policy
的页面会阻止非源JavaScript访问(或详细访问)来自
document.location
的数据。

您可能将此与适用于 同源策略 的情况混淆,该策略防止不同的源相互访问。加载了

<script src="…">
的 JavaScript 在
<script>
元素的来源上下文中运行,而不是与加载它的 URL 相对应的上下文。 (实际上,反过来会是一个更大的安全问题。)没有必要阻止这种 JavaScript 访问特定属性,例如
document.location
鉴于它具有发出同源请求和访问页面内容的完全权限,并且没有真正根据最初加载 JavaScript 的位置来分离 JavaScript(如果您从
cdnjs.com
加载 jQuery,您是否可以这样做
$('<a href>').prop('href')
?)。

简而言之:一旦加载就没有“第三方 JavaScript”的区别,阻止所有第三方 JavaScript 会破坏网络。

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