如何使用JavaScript检测当前浏览器是无头浏览器

  介绍

这篇文章将为大家详细讲解有关如何使用JavaScript检测当前浏览器是无头浏览器,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

JavaScript是一种什么语言

JavaScript是一种动态类型,弱类型的语言,基于对象和事件驱动并具有相对安全性并广泛用于客户端网页开发的脚本语言,同时也是一种广泛用于客户端网络开发的脚本语言。它主要用来给HTML网页添加动态功能,现在JavaScript也可被用于网络服务器,如节点。js .

什么是无头浏览器(无头浏览器)?

无头浏览器是指可以在图形界面情况下运行的浏览器。我可以通过编程来控制无头浏览器自动执行各种任务,比如做测试,给网页截屏等。

为什么叫“无头“浏览器?

"无头”这个词来源于最初的“无头计算机(无头电脑)”。维基百科关于的“无头计算机”词条:

无头系统(无头系统)是指已配置为无须显示器(即“头”),键盘和鼠标操作的计算机系统或设备。无头系统通常通过网络连接控制,但也有部分无头系统的设备需要通过rs - 232串行连接进行设备的管理。服务器通常采用无头模式以降低运作成本。

为什么要检测无头浏览器?

除了之前提到的两种无害的使用案例,无头浏览器可以被用来自动执行恶意任务。最常见的形式是做网络爬虫,或伪装访问量,或探测网站漏洞。

一个非常流行的无头浏览器是Phantomjs,因为它是基于Qt框架,所以跟我们常见的浏览器相比有很多不同的特征,因此有很多方法判断出它。

但是,从chrome 59开始,谷歌发布了一款无头谷歌浏览器。它跟Phantomjs不同,它是基于正统的谷歌浏览器开发出来的,不是基于其它的框架,这让程序很难区分出它是正常浏览器还是无头浏览器。

下面,我们将介绍几种判断程序是运行在普通浏览器还是无头浏览器里的方法。

检测无头浏览器

注意:这些方法只是在四种设备(2 Linux, Mac)里测试过,也就是说,肯定还有其他很多方法检测无头浏览器。

用户代理

先介绍使用做最常见的一种判断浏览器种类的方法,检查用户代理。在Linux计算机里chrome版本59无头浏览器的用户代理值是:

" Mozilla/5.0 (X11;Linux x86_64) AppleWebKit/537.36 (Khtml,像壁虎)HeadlessChrome/59.0.3071.115 Safari 537.36”

于是,我们可以这样检测是否是无头Chrome浏览器:

if  (/HeadlessChrome/test (window.navigator.userAgent)), {   console.log才能(“Chrome  headless  detected");   以前,}

用户代理也可以从HTTP报头里获取。然而,这两种情况都很容易伪造。

插件插件

导航器。插件会返回一个数组,里面是当前浏览器里的插件信息。通常,普通Chrome浏览器有一些缺省插件,比如铬PDF查看器或谷歌原生客户端。相反,在无头模式里,没有任何插件,返回的是个空数组。

如果(navigator.plugins.length ==, 0), {   console.log才能(“It  may  be  Chrome  headless");   }

语言

在谷歌浏览器里,有两个JavaScript属性可以获取当前浏览器的语言设置:导航器。语言和navigator.languages。头一个是指浏览器界面的语言,后一个返回的是个数组,里面存储的是浏览器用户的所有次选语言。然而,在无头模式里,导航器。语言返回的是个空字符串。

如果(navigator.languages ==,““), {   console.log才能(“Chrome  headless  detected");   }

WebGL

WebGL提供了一组能在htmlcanvas里执行3 d渲染的API。通过这些API,我们可以查询出图形驱动的供应商和渲染器。

在linux上的普通谷歌浏览器里,我们获得的渲染器和供应商值为:“Google SwiftShader”和“谷歌(Google Inc .)”。

而在无头模式里,我们获得的一个是“台面幕后”——它是没有使用任何窗口系统的渲染技术的名称,和“布莱恩·保罗”——开源台面图形库的最初的程序。

, var  canvas =, document.createElement(& # 39;帆布# 39;);   ,var  gl =, canvas.getContext (& # 39; webgl # 39;);   ,,   ,var  debugInfo =, gl.getExtension (& # 39; WEBGL_debug_renderer_info& # 39;);   ,var  vendor =, gl.getParameter (debugInfo.UNMASKED_VENDOR_WEBGL);   ,var  renderer =, gl.getParameter (debugInfo.UNMASKED_RENDERER_WEBGL);   ,,   ,如果(==vendor “Brian  Paul",,,, renderer ==,“Mesa  OffScreen"), {   console.log才能(“Chrome  headless  detected");   以前,}

如何使用JavaScript检测当前浏览器是无头浏览器