Web Front-end
JS Tutorial
How does JavaScript detect that the current browser is a headless browser?How does JavaScript detect that the current browser is a headless browser?
What is a headless browser?
Headless browser refers to a browser that can run with a graphical interface. I can control the headless browser to automatically perform various tasks through programming, such as doing tests, taking screenshots of web pages, etc.
是What is a "headless" browser?
The word "headless" comes from the original "headless computer". Wikipedia's entry on "headless computer":
A headless system is one that is configured without a monitor (i.e. "head"), keyboard and A computer system or device operated by a mouse. Headless systems are usually controlled through a network connection, but some headless system devices require device management through an RS-232 serial connection. Servers usually use headless mode to reduce operating costs.
Why should we detect headless browsers?
In addition to the two previously mentioned harmless use cases, headless browsers can be used to automate malicious tasks. The most common form is to crawl the web, fake traffic, or detect website vulnerabilities.
A very popular headless browser is PhantomJS. Because it is based on the Qt framework, it has many different features compared to our common browsers, so there are many ways to judge. out of it.
However, starting from chrome 59, Google released a headless Google Chrome. It is different from PhantomJS in that it is developed based on the orthodox Google Chrome, not other frameworks, which makes it difficult for the program to distinguish whether it is a normal browser or a headless browser.
Below, we will introduce several methods to determine whether a program is running in a normal browser or a headless browser.
Detecting headless browsers
Note: These methods have only been tested on four devices (2 Linux, 2 Mac), and That said, there are certainly many other ways to detect headless browsers.
User agent
First introduce the most common method to determine the type of browser, checking the User agent. In the Linux computer, the User agent value of Chrome version 59 headless browser is:
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/ 59.0.3071.115 Safari/537.36”
So, we can detect whether it is a headless Chrome browser like this:
if (/HeadlessChrome/.test(window.navigator.userAgent)) {
console.log("Chrome headless detected");
}
User agent can also Obtained from HTTP headers. However, both cases are easily faked.
Plugins Plugins
navigator.plugins will return an array containing the plug-in information in the current browser. Usually, the ordinary Chrome browser has some default plug-ins, such as Chrome PDF viewer or Google Native Client. In contrast, in headless mode, there are no plugins and an empty array is returned.
if(navigator.plugins.length == 0) {
console.log("It may be Chrome headless");
}
Language
In Google Chrome, there are two JavaScript properties that can get the current browser language settings: navigator.language and navigator.languages. The first one refers to the language of the browser interface, and the latter one returns an array, which stores all the second-choice languages of the browser user. However, in headless mode, navigator.languages returns an empty string.
if(navigator.languages == "") {
console.log("Chrome headless detected");
}
WebGL
WebGL provides a set of APIs that can perform 3D rendering in HTML canvas. Through these APIs, we can query the graphics driver vendor and renderer.
In the ordinary Google Chrome on Linux, the renderer and vendor values we get are: "Google SwiftShader" and "Google Inc.".
而在无头模式里,我们获得的一个是 “Mesa OffScreen”——它是没有使用任何 window 系统的渲染技术的名称,和 “Brian Paul” ——开源 Mesa 图形库的最初的程序。
var canvas = document.createElement('canvas'); var gl = canvas.getContext('webgl');
var debugInfo = gl.getExtension('WEBGL_debug_renderer_info'); var vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL); var renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
if(vendor == "Brian Paul" && renderer == "Mesa OffScreen") {
console.log("Chrome headless detected");
}
并不是所有版本的无头浏览器都有同样的这两个值。然而目前在无头浏览器里是“Mesa Offscreen” 和 “Brian Paul” 这两个值。
浏览器特征
Modernizr 可以探测出当前浏览器对HTML和CSS各种特性的支持程度。我发现,普通Chrome和无头Chrome里唯一的区别是,无头模式下没有 hairline 特征,它是用来检测是否支持 hidpi/retina hairlines的
if(!Modernizr["hairline"]) {
console.log("It may be Chrome headless");
}
加载失败的图片
最后,我发现的最后一个方法,也是看起来最有效的方法,切入点是检查浏览器里不能正常加载的图片的高和宽。
var body = document.getElementsByTagName("body")[0]; var image = document.createElement("img");
image.src = "http://iloveponeydotcom32188.jg";
image.setAttribute("id", "fakeimage");
body.appendChild(image);
image.onerror = function(){ if(image.width == 0 && image.height == 0) {
console.log("Chrome headless detected");
}
}
这就是检测无头浏览器的详细步骤
推荐教程:《JS教程》
The above is the detailed content of How does JavaScript detect that the current browser is a headless browser?. For more information, please follow other related articles on the PHP Chinese website!
Python vs. JavaScript: The Learning Curve and Ease of UseApr 16, 2025 am 12:12 AMPython is more suitable for beginners, with a smooth learning curve and concise syntax; JavaScript is suitable for front-end development, with a steep learning curve and flexible syntax. 1. Python syntax is intuitive and suitable for data science and back-end development. 2. JavaScript is flexible and widely used in front-end and server-side programming.
Python vs. JavaScript: Community, Libraries, and ResourcesApr 15, 2025 am 12:16 AMPython and JavaScript have their own advantages and disadvantages in terms of community, libraries and resources. 1) The Python community is friendly and suitable for beginners, but the front-end development resources are not as rich as JavaScript. 2) Python is powerful in data science and machine learning libraries, while JavaScript is better in front-end development libraries and frameworks. 3) Both have rich learning resources, but Python is suitable for starting with official documents, while JavaScript is better with MDNWebDocs. The choice should be based on project needs and personal interests.
From C/C to JavaScript: How It All WorksApr 14, 2025 am 12:05 AMThe shift from C/C to JavaScript requires adapting to dynamic typing, garbage collection and asynchronous programming. 1) C/C is a statically typed language that requires manual memory management, while JavaScript is dynamically typed and garbage collection is automatically processed. 2) C/C needs to be compiled into machine code, while JavaScript is an interpreted language. 3) JavaScript introduces concepts such as closures, prototype chains and Promise, which enhances flexibility and asynchronous programming capabilities.
JavaScript Engines: Comparing ImplementationsApr 13, 2025 am 12:05 AMDifferent JavaScript engines have different effects when parsing and executing JavaScript code, because the implementation principles and optimization strategies of each engine differ. 1. Lexical analysis: convert source code into lexical unit. 2. Grammar analysis: Generate an abstract syntax tree. 3. Optimization and compilation: Generate machine code through the JIT compiler. 4. Execute: Run the machine code. V8 engine optimizes through instant compilation and hidden class, SpiderMonkey uses a type inference system, resulting in different performance performance on the same code.
Beyond the Browser: JavaScript in the Real WorldApr 12, 2025 am 12:06 AMJavaScript's applications in the real world include server-side programming, mobile application development and Internet of Things control: 1. Server-side programming is realized through Node.js, suitable for high concurrent request processing. 2. Mobile application development is carried out through ReactNative and supports cross-platform deployment. 3. Used for IoT device control through Johnny-Five library, suitable for hardware interaction.
Building a Multi-Tenant SaaS Application with Next.js (Backend Integration)Apr 11, 2025 am 08:23 AMI built a functional multi-tenant SaaS application (an EdTech app) with your everyday tech tool and you can do the same. First, what’s a multi-tenant SaaS application? Multi-tenant SaaS applications let you serve multiple customers from a sing
How to Build a Multi-Tenant SaaS Application with Next.js (Frontend Integration)Apr 11, 2025 am 08:22 AMThis article demonstrates frontend integration with a backend secured by Permit, building a functional EdTech SaaS application using Next.js. The frontend fetches user permissions to control UI visibility and ensures API requests adhere to role-base
JavaScript: Exploring the Versatility of a Web LanguageApr 11, 2025 am 12:01 AMJavaScript is the core language of modern web development and is widely used for its diversity and flexibility. 1) Front-end development: build dynamic web pages and single-page applications through DOM operations and modern frameworks (such as React, Vue.js, Angular). 2) Server-side development: Node.js uses a non-blocking I/O model to handle high concurrency and real-time applications. 3) Mobile and desktop application development: cross-platform development is realized through ReactNative and Electron to improve development efficiency.


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Dreamweaver Mac version
Visual web development tools

DVWA
Damn Vulnerable Web App (DVWA) is a PHP/MySQL web application that is very vulnerable. Its main goals are to be an aid for security professionals to test their skills and tools in a legal environment, to help web developers better understand the process of securing web applications, and to help teachers/students teach/learn in a classroom environment Web application security. The goal of DVWA is to practice some of the most common web vulnerabilities through a simple and straightforward interface, with varying degrees of difficulty. Please note that this software

Safe Exam Browser
Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

ZendStudio 13.5.1 Mac
Powerful PHP integrated development environment

SublimeText3 English version
Recommended: Win version, supports code prompts!






