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

问题描述 投票:40回答:10

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

  • JavaScript的document.referrer
  • 请求标题,i.n。 PHP qazxsw poi

为了测试目的,我设置了一个显示这些属性的$_SERVER['HTTP_REFERER']

Requirements:

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

当跟随Codepad demo的链接时,该解决方案将用于隐藏引用者。


用例的确切描述

<a href="url">中所述,Google搜索中的链接会在点击时进行修改。所以,

  1. Google可以跟踪您的搜索行为(隐私 - )
  2. 页面请求稍有延迟。
  3. 链接的网页无法跟踪您的Google搜索查询(隐私++)
  4. 拖动/复制的URL看起来像this question on Webapps

我正在开发一个http://google.com/lotsoftrash?url=actualurlUserscript (Firefox) / Content script (Chrome)),它删除了谷歌的链接毁坏事件。结果,处理了第1,2和4点。

第3点仍然存在。

  • Chrome:code
  • Firefox:<a rel="noreferrer">。我已经创建了一种复杂的方法来实现左键和中键的这个功能,同时仍然执行第4点。但是,我正在努力使用右键单击方法。
javascript mouseevent tracking referrer spoofing
10个回答
40
投票

我找到了一个适用于Chrome和Firefox的解决方案。我在用户脚本data-URIs中实现了代码。

演示(在Firefox 9和Chrome 17中测试):Don't track me Google

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

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

  • spec - 单击,中键单击,右键单击上下文菜单,...
  • mousedown(Tab Tab Tab ...输入)。

码:

keydown

*自33以来,Firefox支持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); ,但支持仅限于页内链接。当用户通过上下文菜单打开选项卡时,仍会发送引荐来源。此错误已在Firefox 37 [rel=noreferrer]中修复。

引用者隐藏旧版Firefox

Firefox不支持bug 1031264版本33` [rel="noreferrer"](或37,如果你想隐藏上下文菜单的引用者)。

数据URI + bug 530396可用于隐藏Firefox(和IE)中的引用者。实现此功能更复杂,但也需要两个事件:

  • <meta http-equiv=refresh> - 点击,中键点击,回车
  • click - 右键单击​​,Tab Tab ... Contextmenu

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

基于数据URI和瞬间超时: 触发click事件时,click属性会暂时替换为data-URI。事件结束,并发生默认行为:打开data-URI,具体取决于href属性和SHIFT / CTRL修饰符。 同时,target属性恢复到其原始状态。

触发href事件时,链接也会瞬间变化。

  • contextmenu选项将打开data-URI。
  • Open Link in ...选项指的是已恢复的原始URI。
  • Copy Link location选项引用数据URI。
  • Bookmark指向data-URI。

码:

Save Link as

结合两种方法

不幸的是,没有直接的方法来功能检测这个功能(更不用说帐户的错误)。因此,您可以选择基于// 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); 的相关代码(即UA-sniffing),或使用navigator.userAgent中的一种复杂检测方法。


-2
投票

如果我们使用JavaScript提交FORM,这样就没有引用者了。

(function($){
  var f = $('<iframe src="about:blank" style="display: none !important;">').appendTo('body');
  $('a[rel~=noreferrer]').click(function(event){
    var a = $(event.target.outerHTML);
    a.appendTo(f.contents().find('body'));
    a[0].click();
    return false;
  });
})(jQuery);

基本上我们提交一个带有所需ACTION方法的表格。


10
投票

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

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


6
投票

根据要求,使用JavaScript:

How can I detect rel="noreferrer" support?

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

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

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


3
投票

Javascript中有一个跨浏览器解决方案,它删除了引用者,它使用动态创建的iframe,你可以看看<meta name="referrer" content="no-referrer" /> (免责声明:它使用了我写的一个小JS库)。


3
投票

您可以使用新的proof of concept来防止将referer标头发送到请求源。例:

Referrer Policy standard draft

虽然Chrome和Firefox已经实现了推荐人政策的草案版本,但你应该小心,因为例如Chrome期望<meta name="referrer" content="none"> 而不是no-referrer(我也曾在某处看到过none)。如果您只添加三个单独的元标记,我不知道该行为,但是如果不起作用,您仍然可以只实现一个短脚本,该脚本迭代所有三个值并检查在设置属性后是否确实设置了值元标记的属性。

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


1
投票

这比第一眼看上去更棘手。看看这个项目的代码:

never

他承诺你想要什么,但你必须在链接页面上做。


1
投票

您要求的内容无法在Firefox中完成。

https://github.com/knu/noreferrer总是将当前文档作为引用者传递:

current context menu implementation

显然,不允许用户脚本更改上下文菜单实现,因此唯一的出路是浏览器扩展。

(或者,这将是一个非常糟糕的黑客,通过在// Open linked-to URL in a new window. openLink: function () { var doc = this.target.ownerDocument; urlSecurityCheck(this.linkURL, doc.nodePrincipal); openLinkIn(this.linkURL, "window", { charset: doc.characterSet, referrerURI: doc.documentURIObject // <---------------- }); }, // Open linked-to URL in a new tab. openLinkInTab: function () { var doc = this.target.ownerDocument; urlSecurityCheck(this.linkURL, doc.nodePrincipal); openLinkIn(this.linkURL, "tab", { charset: doc.characterSet, referrerURI: doc.documentURIObject // <---------------- }); }, // open URL in current tab openLinkInCurrent: function () { var doc = this.target.ownerDocument; urlSecurityCheck(this.linkURL, doc.nodePrincipal); openLinkIn(this.linkURL, "current", { charset: doc.characterSet, referrerURI: doc.documentURIObject // <---------------- }); }, 事件上调用preventDefault()禁用上下文菜单,并使用您自己的自定义上下文菜单)


1
投票

可以在以下位置找到非常全面(但简短)的分析:

contextmenu

本文分析了在其他答案(js方法,iframe重定向)中解释的两种方法,最后提出了一个中介重定向页面方法,就像在谷歌搜索链接中看到的那样。


0
投票

我使用jquery实现了一个简单但有效的iframe解决方案。

http://lincolnloop.com/blog/2012/jun/27/referrer-blocking-hard/

https://jsfiddle.net/skibulk/0oebphet/
© www.soinside.com 2019 - 2024. All rights reserved.