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

Rob*_*b W 40 javascript tracking mouseevent spoofing referrer

通常,引荐来源可追溯到:

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

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

要求:

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

在使用链接时,该解决方案将用于隐藏引用者<a href="url">.


用例的确切描述

在Webapps上的此问题中所述,Google搜索中的链接会在点击时进行修改.所以,

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

我正在开发一个用户脚本(Firefox)/内容脚本(Chrome) (代码),它删除了Google的链接残缺事件.结果,处理了第1,2和4点.

第3点仍然存在.

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

Rob*_*b W 40

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

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

推荐人隐藏Webkit(Chrome,..)和Firefox 37+(33 +*)

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

  • mousedown - 单击,中键单击,右键单击上下文菜单,...
  • keydown(Tab 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);
Run Code Online (Sandbox Code Playgroud)

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

引用者隐藏旧版Firefox

Firefox rel="noreferrer"直到33版[ bug 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替换.事件结束,并发生默认行为:打开data-URI,具体取决于target属性和SHIFT/CTRL修饰符.
同时,href属性恢复到其原始状态.

contextmenu触发事件,该链接也改变一个瞬间.

  • Open Link in ...选项将打开数据-URI.
  • Copy Link location选项引用已恢复的原始URI.
  • ☹该Bookmark选项引用数据URI.
  • Save Link as指向data-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);
Run Code Online (Sandbox Code Playgroud)

结合两种方法

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


fms*_*msf 10

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

如果围绕每个链接包装iframe,则iframe可以充当外部取消引用.用户可以单击框架内的链接,打开其引用者设置为iFrame位置的页面,而不是实际页面.

  • 我已经给你的答案奖励,因为它包含了一个潜在有用的概念,经过调整.但是这种方法存在一些缺点/问题.主要问题是框架的定位和位置.使用`tab`键在链接之间导航也变得更加复杂.最后,在所有锚点上动态添加帧的性能命中/平滑度也是一个值得关注的主题. (2认同)

Mar*_*rcG 6

根据要求,使用JavaScript:

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

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

<meta name="referrer" content="no-referrer" />
Run Code Online (Sandbox Code Playgroud)

截至2015年,这是您阻止发送Referer标头的方法.

  • 对于链接,是的.但是,元标记也适用于Ajax请求.它似乎是禁用Ajax引用的唯一方法. (2认同)