草庐IT

javascript - 在 JavaScript 中隐藏/欺骗引荐来源网址的最可靠方法是什么?

coder 2023-07-05 原文

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

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

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

#要求:

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

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


##用例的准确描述 如 this question on Webapps 中所述, Google 搜索中的链接会在点击时被修改。因此,

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

我正在开发 Userscript (Firefox) / Content script (Chrome) ( code ),它删除了 Google 的链接破坏事件。因此,第 1、2 和 4 点得到处理。

第 3 点仍然存在。

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

最佳答案

我找到了一个适用于 Chrome 和 Firefox 的解决方案。我已经在用户脚本中实现了代码, Don't track me Google .

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

为 Webkit(Chrome,..)和 Firefox 37+ (33+*) 隐藏 Referrer

基于 Webkit 的浏览器(例如 Chrome、Safari)support <a rel="noreferrer"> spec .
通过将此方法与两个事件监听器结合使用,可以完全实现 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);

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

为旧的 Firefox 版本隐藏 Referrer

Firefox 不支持 rel="noreferrer"直到版本 33 `[ bug 530396 ](或 37,如果您也希望隐藏上下文菜单的引荐来源网址)。

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

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

在 Firefox 中,click每个 mouseup 都会触发事件在链接(或表单控件)上按Entercontextmenu事件是必需的,因为 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 嗅探),或使用 How can I detect rel="noreferrer" support? 中的一种复杂检测方法.

关于javascript - 在 JavaScript 中隐藏/欺骗引荐来源网址的最可靠方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8893269/

有关javascript - 在 JavaScript 中隐藏/欺骗引荐来源网址的最可靠方法是什么?的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  5. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  6. Ruby 方法() 方法 - 2

    我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby​​-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco

  7. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  8. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  9. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  10. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

随机推荐