通常情况下,推荐人可通过以下方式追踪:
document.referrer
$_SERVER['HTTP_REFERER']
我已设置 Codepad demo ,以显示这些属性,以用于测试目的。
该解决方案将用于在关注<a href="url">
链接时隐藏引荐来源。
如this question on Webapps所述,Google搜索中的链接会在点击时修改。因此,
http://google.com/lotsoftrash?url=actualurl
。我正在开发一个Userscript (Firefox) / Content script (Chrome) (code),这会删除Google的链接残缺事件。结果,处理了第1,2和4点。
第3点仍然存在。
<a rel="noreferrer">
data-URIs
。我已经创建了一种复杂的方法来实现左键和中键点击功能,同时仍然强制执行第4点。但是,我正在努力使用右键单击方法。 答案 0 :(得分:40)
我找到了适用于Chrome和Firefox的解决方案。我已在用户文档 Don't track me Google 中实现了代码。
演示(在Firefox 9和Chrome 17中测试): http://jsfiddle.net/RxHw5/
基于Webkit的浏览器(例如Chrome,Safari)support <a rel="noreferrer">
spec 。
通过将此方法与两个事件侦听器相结合,可以完全实现Referrer隐藏:
mousedown
- 点击,中键点击,右键点击上下文菜单,... keydown
(制表符 制表符 制表符 ... 输入)。代码:
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);
自33以来,Firefox支持 * rel=noreferrer
,但支持仅限于页内链接。当用户通过上下文菜单打开选项卡时,仍会发送引荐来源。此错误已在Firefox 37 [bug 1031264] 。
Firefox版本33“ [bug 530396] 之前不支持rel="noreferrer"
(如果您希望隐藏上下文菜单的引荐来源,则不支持37)。
数据URI + <meta http-equiv=refresh>
可用于隐藏Firefox(和IE)中的引荐来源。实现此功能更复杂,但也需要两个事件:
click
- 点击后,点击鼠标中键,输入 contextmenu
- 右键单击,标签 标签 ... Contextmenu 在Firefox中,每个click
和在链接(或表单控件)上点击 Enter 会触发mouseup
事件。 contextmenu
事件是必需的,因为click
事件对于这种情况来说太晚了。
基于数据URI和瞬间超时:
触发click
事件时,href
属性会暂时替换为data-URI。事件结束,并发生默认行为:打开data-URI,具体取决于target
属性和SHIFT / CTRL修饰符。
同时,href
属性将恢复到其原始状态。
当触发contextmenu
事件时,链接也会瞬间更改。
Open Link in ...
选项将打开data-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);
不幸的是,没有直接的功能来检测此功能(更不用说帐户的错误)了。因此,您可以选择基于navigator.userAgent
的相关代码(即UA嗅探),也可以使用How can I detect rel="noreferrer" support?中的一种错综复杂的检测方法。
答案 1 :(得分:10)
你不能创建一个驻留在iframe中的链接系统吗?
如果围绕每个链接包装iframe,iframe可以充当外部取消引用。用户可以单击框架内的链接,打开其引荐来源设置为iFrame位置的页面,而不是实际页面。
答案 2 :(得分:3)
Javascript中有一个跨浏览器解决方案,它删除了引用者,它使用动态创建的iframe,你可以看看proof of concept(免责声明:它使用了我写的一个小库)。
答案 3 :(得分:3)
您可以使用新的Referrer Policy standard draft来防止将referer标头发送到请求源。例如:
<meta name="referrer" content="none">
虽然Chrome和Firefox已经实施了推荐人政策的草稿版本,但您应该小心谨慎,因为例如Chrome预计会no-referrer
而不是none
(我也看到{{1}在某处)。如果您只添加三个单独的元标记,我不知道该行为,但是如果不起作用,您仍然可以只实现一个短脚本,该脚本迭代所有三个值并检查在设置属性后是否确实设置了值元标记的属性。
此元标记适用于当前页面上的所有请求(ajax,图像,脚本,其他资源......)以及导航到其他页面。
答案 4 :(得分:1)
答案 5 :(得分:1)
您要求的内容无法在Firefox中完成。
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()
事件上的contextmenu
来禁用上下文菜单,并使用您自己的自定义上下文菜单)
答案 6 :(得分:1)
可以在以下网址找到非常全面(但简短)的分析:
http://lincolnloop.com/blog/2012/jun/27/referrer-blocking-hard/
本文分析了其他答案(js方法,iframe重定向)中解释的两种方法,最后建议了一个中介重定向页面方法,就像在谷歌搜索链接中看到的那样。
答案 7 :(得分:0)
我使用jquery实现了一个简单但有效的iframe解决方案。
https://jsfiddle.net/skibulk/0oebphet/
(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);
答案 8 :(得分:-2)
如果我们使用JavaScript提交FORM,这样就没有推荐人。
document.form_name.submit()
基本上我们提交了一个包含所需 ACTION 方法的表单。