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

2023-12-09

通常,引荐来源网址可通过以下方式追踪:

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

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

#要求:

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

该解决方案将用于在点击链接时隐藏引荐来源网址<a href="url">.


##用例的准确描述 如中所述关于 Webapps 的这个问题,Google 搜索中的链接会在点击时修改。最后,

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

I'm developing a Userscript (Firefox) / Content script (Chrome) (code), which removes Google's link-mutilating event. As a result, points 1, 2 and 4 are dealt with.

第 3 点仍然存在。

  • Chrome: <a rel="noreferrer">
  • 火狐浏览器:data-URIs。我创建了一种复杂的方法来实现左键单击和中键单击的此功能,同时仍然强制执行第 4 点。但是,我正在努力使用右键单击方法。

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

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

Webkit(Chrome,..)和 Firefox 37+ (33+*) 的引荐来源网址隐藏

Webkit-based browsers (such as Chrome, Safari) support <a rel="noreferrer">spec.
Referrer hiding can fully be implemented by combining this method with two event listeners:

  • mousedown- 单击、中键单击、右键单击上下文菜单,...
  • keydown (Tab Tab Tab ... Enter).

Code:

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 is supported in Firefox since 33, but support was limited to in-page links. Referrers were still sent when the user opened the tab via the context menu. This bug was fixed in Firefox 37 [bug 1031264].

旧版 Firefox 的引荐来源网址隐藏

Firefox did not support rel="noreferrer" until version 33 `[bug 530396] (or 37, if you wish to hide the referrer for context menus as well).

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

  • click - On click, on middle-click, Enter
  • contextmenu - On right-click, Tab Tab ... Contextmenu

In Firefox, the click event is fired for each mouseup and hitting Enter on a link (or form control). The contextmenu event is required, because the click event fires too late for this case.

基于数据 URI 和瞬间超时:
当。。。的时候click事件被触发时,href属性暂时替换为 data-URI。事件完成,并且发生默认行为:打开 data-URI,取决于target属性和 SHIFT/CTRL 修饰符。
与此同时,href属性恢复到原来的状态。

当。。。的时候contextmenu事件被触发时,链接也会瞬间发生变化。

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

Code:

// 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" 支持?.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 循环选项在 youtube js api 中不起作用

    我想知道为什么我的代码不循环播放视频 除了循环选项之外 一切正常 我真的需要它 多谢 div You need Flash player 8 and JavaScript enabled to view this video div
  • Vue.js + Element UI:在更改时获取“event.target”

    我无法获取在事件处理程序中触发事件的 html 字段 在 javascript 中是event target 我有一个表格 附加到更改事件函数的输入元素 管理更改事件的函数 我的代码如下 var Main methods change pa
  • 将相同的多个对象推送到多个数组中

    这是后续使3个数组相互对应 第一个是对象名称 https stackoverflow com questions 57564488 make 3 arrays correspond to each other with the first
  • 禁用 chrome React DevTools 以进行生产

    我正在尝试使用 gulp 和 envify 对我的 React 应用程序进行浏览器化以设置 NODE ENV 因此 我可以删除反应警告 控制台中的错误报告 甚至我的代码来禁用某些功能 例如react addons perf的要求 而且效果很
  • YouTube 360​​ 视频 iframe 无法在移动浏览器中工作

    我正在尝试为 YouTube 360 视频获取嵌入的 iframe 以便在我的移动网站上播放 它在桌面浏览器上运行良好 但在移动浏览器中我只能播放平面立体视图 我可以确认它绝对是一个 HTML5 播放器 这显然是其他人正在经历的一个未解决的
  • (IE 特定)如何确定输入的文本是否比输入元素的宽度长

    这是所有版本 IE 特有的问题 在所有其他浏览器中 当文本溢出时 输入元素的scrollWidth 大于输入元素的clientWidth 有没有办法确定IE中输入字段中的文本超出了输入元素宽度的键 下面是一个检查 clientWidth 与
  • Java中单击和双击的区别

    我搜索论坛并看到以下代码 public void mouseClicked MouseEvent e if e getClickCount 2 System out println and it s a double click wasDo
  • 如何将毫秒转换为可读的日期?

    下列 new Date 1324339200000 toUTCString Outputs Tue 20 Dec 2011 00 00 00 GMT 我需要它返回Dec 20 除了我可以使用的更好的方法之外toUTCString 我正在寻找
  • 在 JSON 数组中按属性查找对象

    我在获取 JSON 数据中的字符串时遇到问题 格式如下 name Alice age 20 id David last 25 id John last 30 有时它会一起改变位置 John从第三名到第二名 name Alice age 20
  • 优化重叠矩形的绘制

    我有很多矩形 有些与其他矩形重叠 每个矩形都有一个绝对 z 顺序和一个colour 每个 矩形 实际上是粒子效果 网格或纹理的轴对齐边界框 并且可能是半透明的 但只要您不尝试剔除其他矩形后面的矩形 就更容易抽象地思考彩色矩形 所以我将在问题
  • 在多个 angular.js 应用程序之间共享单个服务

    我正在构建一个电子商务网站 基于 shopify 并且使用多个小型 angularjs 应用程序来处理诸如快速购物车 愿望清单 过滤产品和其他一些较小项目之类的事情 我最初使用了一个大型应用程序 具有路由和所有内容 但当我没有完整的 RES
  • 如何使用谷歌地图检测一个点是否在多边形内部?

    我想检测到google maps LatLng是在一个里面google maps Polygon 我怎样才能做到这一点 Cheers 你可以使用这个谷歌地图V3 google maps geometry poly containsLocat
  • .then(functionReference) 和 .then(function(value){return functionReference(value)}) 之间有区别吗?

    给定一个用于处理的命名函数Promise value function handlePromise data do stuff with data return data a 传递命名函数handlePromise作为参考 then pro
  • React-Router v5 History.push 不触发组件

    很抱歉朋友们又问这个问题了 我找到了解决这个问题的几个方法 但他们让我很困惑 我只是想问一个优雅的方法来做到这一点 正如你通过标题所理解的 我有一个关于反应路由的问题 让我解释 我有一个按钮 其名称是Login 单击按钮后 我执行了一些逻辑
  • 无法将中间件与 Firebase 和 NuxtJS 3 一起使用

    我正在尝试在示例项目中使用 Firebase 身份验证 身份验证按预期工作 但是一旦我想使用中间件来阻止用户访问管理页面或在已经登录的情况下访问登录页面 这是不可能的 我已经尝试了几个小时 但没有任何效果 这是我的package json
  • 脚本标签内的 Razor RenderSection - 如何将脚本从视图插入模板函数

    我正在使用 MVC 3 和 Razor 视图引擎 我想将多个视图中的脚本注入到一个集中定义的视图中 document ready 母版页中的功能 我已经尝试过以下方法 在我的大师看来 然后 section DocumentReady ale
  • 添加元数据到快速路线

    有什么方法可以将元数据添加到 Express 的路线中吗 例如 app get some route function req res some meta data 我正在寻找一种针对我的节点应用程序的 AOP 方法 因此我想通过身份验证和
  • jQuery.ajax() 记录 HTTP 请求

    我有一个发送 HTTP POST 请求的函数 我想记录它以进行调试 这是函数 function serverRequest URL DATA callback ajax url URL type POST dataType text con
  • 如何防止 CSS 或 jQuery 中单词和标点符号之间的换行

    我在一个段落中有一些文字 我的问题是 当标点符号位于单词末尾时 有时可以换行到下一行 像这样 This is the text This is a new line 我可以用 CSS 或 jQuery 解决这个问题吗 如果您不在单词和标点符
  • 如何找出javascript中加载了哪些javascript?

    继另一个问题的评论之后 我问自己是否有办法获取页面上加载的所有 js 代码的列表 就像 Firebug 或 chrome Inspector 所做的那样 有没有一种纯javascript的方法 一种方法是抓取脚本标签 但这样你可能会错过动态

随机推荐

  • Task.WhenAny 和 SemaphoreSlim 类

    使用时WaitHandle WaitAny and Semaphore class像下面这样 var s1 new Semaphore 1 1 var s2 new Semaphore 1 1 var handles new s1 s2 v
  • 在调用所有 Promise 后循环遍历 jQuery Deferreds

    我目前正在尝试使用 HTML5 FileAPI 构建文件上传器 文件上传器应该处理多个文件并显示图像预览 如果文件是图像 由于 FileReader 类异步工作 我想等到所有文件都被读取 因此我正在使用 Deferreds 读取文件的方法返
  • Logstash:跨事件保持值

    我有一个日期在每个日志文件中只出现一次 并且我尝试在匹配一次后将该日期添加到所有后续事件中 使其在某些方面充当全局变量 日期位于文档顶部 我无法使用multiline或更改文件名或内容 为此 我的方法是使用grep过滤器drop gt fa
  • 使用 chrome.tabCapture.capture() 和 MediaRecorder() 时选项卡的原始音频被静音

    当我使用 chrome tabCapture capture 和 MediaRecorder API 来记录我正在捕获的选项卡的流原始音频时 该音频被静音 但音频在录制的流中正常 我希望选项卡中的音频正常运行 class Recorder
  • 我应该如何在 Java 中使用 getResource() ?

    这个问题在很多地方都有人提出 但也有很多细微的差别 例如Java getClassLoader getResource 让我发疯等等 我仍然无法让它发挥作用 这是一个代码片段 String clipName Chook wav ClassL
  • 为什么不可能覆盖仅 getter 的属性并添加 setter?

    为什么不允许使用以下 C 代码 public abstract class BaseClass public abstract int Bar get public class ConcreteClass BaseClass public
  • 如何并排放置两个jpanel

    我尝试将两个 jpanel 并排放置 但此时我无法执行我想要的操作 我有这个代码 this videoPanel new JPanel this videoPanel setBackground new Color 102 102 102
  • 在 Windows 批处理文件中访问剪贴板

    知道如何使用批处理文件访问 Windows 剪贴板吗 设置剪贴板的内容 如 Chris Thornton klaatu 和一堆其他人已经说过 使用 windir system32 clip exe 更新2 对于快速的一句台词 你可以这样做
  • 在Android中查看holder类

    这是一个基本问题 我正在浏览谷歌关于 Android 的官方视频 在其中他们使用 Viewholder 类作为 静态类Viewholder Image查看图像 文本视图文本 将此类声明为静态或将视图持有者用作静态内部类是否正确 我认为假设如
  • Python:运行时根据requirements.txt设置PYTHONPATH

    我有一个带有命令行脚本的 Python 应用程序 我通过公开脚本setuptools 入口点 功能 每当用户运行脚本时 我希望环境与包的一致requirements txt 这意味着环境必须包含与版本说明符匹配的每个依赖包的版本requir
  • SQLCMD:提示输入变量?

    来自 Oracle 的背景 Oracle 的 SQLPlus 可以让您指示一个变量 如果未设置该变量 系统会提示您提供一个值 我正在使用 SQLCMD 使用 var name 语法 在 SSMS SQLCMD 模式下 我得到 发生致命的脚本
  • Anaconda 更新后 Jupyter Notebook 内核失效

    我遇到了以下问题 更新 Anaconda 后 因为我将 skimage io 导入 Jupyter Notebook 中的项目时出错 出现了更大的错误 Dead Kernel 现在我无法启动一个项目 因为 Jupyter 给出以下错误 Co
  • 如何使用 iText\iTextSharp 创建圆角表格? [复制]

    这个问题在这里已经有答案了 我必须创建一个具有圆角的表格 如下所示 我可以用 iTextSharp 做到这一点吗 这是使用单元事件完成的 请参阅我的书中的日历示例 Java C 确保您没有向单元格添加任何 自动 边框 而是在单元格事件中自己
  • 防止浮动 div 换行到下一行

    首先 这是我的网站 您会注意到 在页面中间的分隔栏下方 有三列 一列包含表单 一列包含文本 一列包含链接 现在 将窗口大小调整为稍微小一些 右侧的 div 将下降到下一行 有没有办法不显示它 所以divs会调整 我有一个液体布局 到它们不适
  • 如何使用 CSS 来换行而不是用空格换行?

    使用以下标记 是否可以 以及如何 实现如预览中所示的换行 Markup div class filled box h2 Hi there h2 p I am just a text with some words that want to
  • XSLT 与 XProc - 所需类型中的参数绑定

    我正在尝试将调用 Saxon 版本 8 9 的批处理文件转换为 XProc 管道 Calabash 这是我的批量调用 java jar saxon8 jar o out xml in xml style xsl config config
  • 如何将数据表中的记录分页发送到服务器类

    当我单击全选 超链接 选项时 或者我想要将特定页面中的特定记录 使用复选框 发送到服务器类时 我试图将 jQuery 数据表中的所有记录发送到服务器类 但问题是当我单击表单提交按钮时 即导出PDF 仅获取当前页面中的记录 即使在 jquer
  • iOS 应用程序提交:删除 iPad 支持

    我有一个 iPhone 应用程序 不支持 iPad 布局 在 App Store 中发布了一年 我的客户希望从 iPad 的 App Store 中删除该应用程序 我知道它需要更新应用程序 但如何更改我的 plist 以反映更改 苹果允许这
  • 在 Linq 表达式主体中如何使用变量的值而不是对其的引用?

    这是我的代码 IQueryable
  • 在 JavaScript 中隐藏/欺骗引用者的最可靠方法是什么?

    通常 引荐来源网址可通过以下方式追踪 JavaScript 的document referrer 请求标头 即PHP SERVER HTTP REFERER 我已经设置了一个键盘演示它显示了这些属性 用于测试目的 要求 原始引用者应该有效地