在 JavaScript 中隐藏/欺骗引用者的最可靠方法是什么?

IT技术 javascript mouseevent tracking referrer spoofing
2021-03-02 09:47:26

通常,推荐人可以通过以下方式进行追踪:

  • JavaScript的 document.referrer
  • 请求标头,例如 PHP 的 $_SERVER['HTTP_REFERER']

我已经设置了一个Codepad 演示来显示这些属性,用于测试目的。

#要求:

  1. 应该有效地隐藏原始引用,至少对于所有鼠标事件。
  2. 跨浏览器支持(至少 Chrome 和 Firefox)。
  3. 独立的,没有任何外部内容(插件、库、重定向页面等)。
  4. 无副作用:友情链接应该没有被改写,历史条目应当保留

该解决方案将用于在关注<a href="url">.


##Exact 用例的描述 如Webapps 上的这个问题所述,Google 搜索中的链接会在点击时进行修改。最后,

  1. Google 能够跟踪您的搜索行为(隐私 - )
  2. 页面请求稍有延迟。
  3. 链接页面无法跟踪您的 Google 搜索查询(隐私 ++)
  4. 拖动/复制的 URL 看起来像http://google.com/lotsoftrash?url=actualurl.

我正在开发一个Userscript (Firefox) / Content script (Chrome) ( code ),它删除了谷歌的链接破坏事件。结果,处理了第 1、2 和 4 点。

第 3 点仍然存在。

  • 铬合金: <a rel="noreferrer">
  • 火狐:data-URIs我已经创建了一种复杂的方法来为左键和中键单击实现此功能,同时仍然执行第 4 点。但是,我正在努力使用右键单击方法。
6个回答

我找到了一个适用于 Chrome 和 Firefox 的解决方案。我已经在用户脚本中实现了代码,不要跟踪我 Google

演示(在 Firefox 9 和 Chrome 17 中测试):http : //jsfiddle.net/RxHw5/

Webkit (Chrome, ..) 和 Firefox 37+ (33+*) 的引用隐藏

基于 Webkit 的浏览器(例如 Chrome、Safari)支持 <a rel="noreferrer">规范.
通过将此方法与两个事件侦听器相结合,可以完全实现引用隐藏:

  • mousedown - 单击、中键、右键单击上下文菜单,...
  • keydownTab Tab Tab…… Enter)。

代码:

function hideRefer(e) {
   var a = e.target;
   // The following line is used to deal with nested elements,
   //  such as: <a href="."> Stack <em>Overflow</em> </a>.
   if (a && a.tagName !== 'A') a = a.parentNode;
   if (a && a.tagName === 'A') {
      a.rel = 'noreferrer';
   }
}
window.addEventListener('mousedown', hideRefer, true);
window.addEventListener('keydown', hideRefer, true);

*rel=noreferrer自 33 以来在 Firefox 中得到支持,但支持仅限于页内链接。当用户通过上下文菜单打开选项卡时,仍然发送引用。此错误已在 Firefox 37 [错误 1031264 ] 中修复

旧版 Firefox 的引用隐藏

Firefox 不支持rel="noreferrer"直到版本 33 ` [错误 530396 ](或 37,如果您还希望隐藏上下文菜单的引用)。

数据 URI +<meta http-equiv=refresh>可用于在 Firefox(和 IE)中隐藏引用。实现这个功能比较复杂,还需要两个事件:

  • click - 单击时,中键时, Enter
  • contextmenu- 右键单击​​,Tab Tab...Contextmenu

在Firefox中,click事件被触发为每个mouseup 击球Enter上的链接(或表单控件)。contextmenu事件是必需的,因为click对于这种情况,该事件触发得太晚了。

基于数据 URI 和分秒超时:
click事件被触发时,href属性被临时替换为数据 URI。事件完成,默认行为发生:打开数据 URI,取决于target属性和 SHIFT/CTRL 修饰符。
同时,href属性恢复到原来的状态。

contextmenu事件被触发时,链接也会在一瞬间发生变化。

  • 这些Open Link in ...选项将打开数据 URI。
  • Copy Link location选项指的是恢复的原始 URI。
  • ☹ 该Bookmark选项是指数据URI。
  • Save Link as指向数据URI。

代码:

// Create a data-URI, redirection by <meta http-equiv=refresh content="0;url=..">
function doNotTrack(url) {
   // As short as possible. " can potentially break the <meta content> attribute,
   // # breaks the data-URI. So, escape both characters.
   var url = url.replace(/"/g,'%22').replace(/#/g,'%23');
   // In case the server does not respond, or if one wants to bookmark the page,
   //  also include an anchor. Strictly, only <meta ... > is needed.
   url = '<title>Redirect</title>'
       + '<a href="' +url+ '" style="color:blue">' +url+ '</a>'
       + '<meta http-equiv=refresh content="0;url=' +url+ '">';
   return 'data:text/html,' + url;
}
function hideRefer(e) {
   var a = e.target;
   if (a && a.tagName !== 'A') a = a.parentNode;
   if (a && a.tagName === 'A') {
      if (e.type == 'contextmenu' || e.button < 2) {
         var realHref = a.href; // Remember original URI
         // Replaces href attribute with data-URI
         a.href = doNotTrack(a.href);
         // Restore the URI, as soon as possible
         setTimeout(function() {a.href = realHref;}, 4);
      }
   }
}
document.addEventListener('click', hideRefer, true);
document.addEventListener('contextmenu', hideRefer, true);

结合两种方法

不幸的是,没有直接的方法来检测这个特性(更不用说考虑错误了)。因此,您可以选择基于navigator.userAgent(即 UA 嗅探)的相关代码,或使用如何检测 rel="noreferrer" 支持中的复杂检测方法之一.

在 Firefox 28 中使用事件侦听器对元素(而不是文档)进行中键单击不会触发 hideRefer。有任何想法吗?
2021-04-19 09:47:26
带有 rel='noreferrer'(无 javascript)的上下文菜单不会隐藏 Chrome 34 上的引用。有任何想法吗?
2021-05-06 09:47:26
漏洞530396已得到修复。
2021-05-07 09:47:26
不幸的是,数据:URI 不能在 IE 中使用,IE 只支持可下载的内容,而不是 HTML。
2021-05-08 09:47:26
2021-05-09 09:47:26

您不能创建一个驻留在 iframe 中的链接系统吗?

如果您将 iframe 包裹在每个链接周围,则 iframe 可以充当外部取消引用。用户将单击框架内的链接,打开一个页面,其引用设置为 iFrame 的位置,而不是实际页面。

我已经对你的答案给予了奖励,因为它包含了一个潜在有用的概念,经过调整。不过,这种方法有一些缺点/问题。主要问题是框架的定位和定位。使用tab键在链接之间导航也变得更加复杂。最后,在所有锚点上动态添加帧的性能命中/平滑度也是一个值得关注的主题。
2021-04-17 09:47:26
我刚刚再次阅读了您的答案。这是个好主意。您能否详细说明在不使用外部页面的情况下设置 iFrame 的不同 URL 的想法?定位 iFrame 怎么样?
2021-05-01 09:47:26
jpgerek实现了这个答案中描述的方法。请参阅此页面上的此答案
2021-05-11 09:47:26

根据要求,通过使用 JavaScript:

var meta = document.createElement('meta');
meta.name = "referrer";
meta.content = "no-referrer";
document.getElementsByTagName('head')[0].appendChild(meta);

这会将以下元标记添加到网页的 head 部分:

<meta name="referrer" content="no-referrer" />

截至 2015 年,这是您防止发送 Referer 标头的方式。

<meta name=referrer>如果你总是想声明一个特定的引用策略,这似乎是一个很好的选择,但否则(如果你只想定位一个特定的链接)使用<a rel="noreferrer">更合适,因为 1)它优先于引用策略,2)它是特定的链接并且不会对文档中的其他链接产生副作用,并且 3) 它具有更好的浏览器支持。
2021-04-20 09:47:26
对于链接,是的。但是,元标记也适用于 Ajax 请求。这似乎是禁用 Ajax 引用的唯一方法。
2021-04-26 09:47:26
这似乎适用于 Firefox、Chrome 和 Opera(据说也适用于最新版本的 Safari - caniuse.com/referrer-policy),但我在规范没有看到明确声明通过 JavaScript 插入元标记变为立即生效。如果 UA 停止处理脚本注入的元标记,它们仍然符合标准。显然(基于在bugzil.la/704320上阅读 Firefox 的实现),最后处理的元标记总是“获胜”。(待续)
2021-05-10 09:47:26

Javascript 中有一个跨浏览器解决方案可以删除引用,它使用动态创建的 Iframe,您可以查看概念证明(免责声明:它使用了我编写的一个小 JS 库)。

此链接已死
2021-05-14 09:47:26
感谢您发布此答案中描述的方法的实现但它在 Opera 中不起作用(已测试 11.62、12.00b、12.02)。另一方面,它在 Safari 3+、Chrome 1+、Firefox 1+ 和 IE6、7 和 8 中确实有效。它在 Internet Explorer 9 和 10无效因此,在实践中,它只在 Chrome、Safari 和 Firefox 中有用。
2021-05-15 09:47:26

您可以使用新的Referrer Policy 标准草案来防止将 Referer 标头发送到请求源。例子:

<meta name="referrer" content="none">

尽管 Chrome 和 Firefox 已经实施了 Referrer Policy 的草案版本,但您应该小心使用它,因为例如 Chrome 期望no-referrer而不是none(我也在never某处看到)。如果您只添加三个单独的元标记,我不知道行为,但如果这不起作用,您仍然可以实现一个简短的脚本,该脚本迭代所有三个值并检查该值是否在设置属性后真正设置/元标记的属性。

此元标记适用于当前页面上的所有请求(ajax、图像、脚本、其他资源...)和导航到另一个页面。