【问题标题】:How to protect document.referrer from third party script changes?如何保护 document.referrer 免受第三方脚本更改的影响?
【发布时间】:2019-09-12 12:54:22
【问题描述】:

我在我的网站上使用了第三方脚本(Chaordic loader.js 用于产品推荐),它用垃圾覆盖了document.referrer,这让我很头疼。

问题:有没有办法防止这种修改?我可以以某种方式“冻结/密封”document.referrer 吗?

我知道我可以取消与公司的合同,但想先试试这个锁。我可以将javascript代码放在第三方代码之前或之后,但不能修改它。

覆盖document.referrer的第三部分代码:

var t = window.chaordic && window.chaordic.readCookie && window.chaordic.readCookie(e);
Object.defineProperty(window.document, "referrer", {
  configurable: false,
  get: function() { return t }
});

【问题讨论】:

  • 在这段代码运行前保存数据,运行后再添加回来?

标签: javascript referrer


【解决方案1】:

答案几乎就在你的问题中

// You need to put the following code before their code runs 
const referrer = document.referrer;
Object.defineProperty(window.document, "referrer", {
  configurable: false,
  get: () => referrer,
});

你也可以这样做

Object.defineProperty(window.document, "referrer", {
  configurable: false,
  writable: false,
  value: document.referrer
});

现在除了 Javascript,我会考虑其他选项。更改 document.referrer 是他们正在做的一件你知道的讨厌的事情。他们可能正在做其他你不知道的讨厌的事情。

【讨论】:

  • 哇!我喜欢第二种解决方案。非常感谢!第一个也有效,但我不明白 set 方法的需要。尝试像您的示例一样设置document.referrer = 'sad',但它没有更改 document.referrer 值。我发现如果没有set 方法,它的工作原理是一样的。也许我做错了什么。无论如何,再次感谢您!
  • 是的,确实不需要 setter 属性,省略它也会阻止写入该属性。我编辑了我的答案。此外,如果您喜欢其他人阅读此问题的答案,会发现它更容易(许多人在选择答案时取决于投票数)。
  • 我试过喜欢这个答案,但由于我没有声誉,所以不会显示喜欢的东西。 :( 这是当我尝试点赞时出现的消息:“感谢您的反馈!声望低于 15 人的投票将被记录,但不要更改公开显示的帖子得分。”
【解决方案2】:

如果您可以控制将您带到与document.referrer 混淆的页面的文档,请确保使用rel="noreferrer" 属性设置任何/所有链接,该属性告诉当前窗口不要保留在导航到下一个窗口时引用自身,使 document.referrer 返回为 null。

由于我不确定您是否可以访问调用页面或您在目标页面上的结束情况,因此我没有将您的问题标记为重复,但有更多信息 here

【讨论】:

  • 嗨,斯科特。谢谢你的回答。事实上,我的网站是一个电子商务网站,我确实需要能够看到为我的网站带来流量的推荐。 Ehab 的解决方案解决了我的问题。谢谢!
猜你喜欢
  • 2012-12-20
  • 2015-12-20
  • 2010-10-01
  • 1970-01-01
  • 2014-10-15
  • 2015-10-26
  • 2011-07-09
  • 1970-01-01
相关资源
最近更新 更多