Giter Site home page Giter Site logo

infosimples / detect-headless Goto Github PK

View Code? Open in Web Editor NEW
251.0 18.0 34.0 18 KB

Access https://infosimples.github.io/detect-headless to run several headless detection tests against your browser.

License: MIT License

HTML 4.67% JavaScript 89.69% CSS 5.64%

detect-headless's Introduction

Detect Headless

Access https://infosimples.github.io/detect-headless to run several headless detection tests against your browser.

Tests

  • User Agent: in a browser running with puppeteer in headless mode, user agent includes Headless.

  • App Version: same as User Agent above.

  • Plugins: headless browsers don't have any plugins. So we can say that if it has plugin it's headful, but not otherwise since some browsers, like Firefox, don't have default plugins.

  • Plugins Prototype: check if the Plugin and PluginsArray prototype are correct.

  • Mime Type: similar to Plugins test, where headless browsers don't have any mime type

  • Mime Type Prototype: check if the MimeType and MimeTypeArrayprototype are correct.

  • Languages: all headful browser has at least one language. So we can say that if it has no language it's headless.

  • Webdriver: this property is true when running in a headless browser.

  • Time elapse: it pops an alert() on page and if it's closed too fast, means that it's headless.

  • Chrome element: it's specific for chrome browser that has an element window.chrome.

  • Permission: in headless mode Notification.permission and navigator.permissions.query report contradictory values.

  • Devtool: puppeteer works on devtools protocol, this test checks if devtool is present or not.

  • Broken Image: all browser has a default nonzero broken image size, and this may not happen on a headless browser.

  • Outer Dimension: the attributes outerHeight and outerWidth have value 0 on headless browser.

  • Connection Rtt: The attribute navigator.connection.rtt,if present, has value 0 on headless browser.

  • Mouse Move: The attributes movementX and movementY on every MouseEvent have value 0 on headless browser.

detect-headless's People

Contributors

barbolo avatar bobberr avatar cezar-lima avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

detect-headless's Issues

How can I bypass Plugins Prototype

Isn't there a standard answer to this question?
I passed almost all the tests.
But Plugins Prototype Test is an exception.
Could you please help me?

const puppeteer = require('puppeteer');

async function test() {
    var browser = await puppeteer.launch({
        ignoreDefaultArgs: ['--enable-automation'],
    });
    var page = await pageInit(browser);
    // var page = await browser.newPage();
    page.on('dialog', async (age) => {
        console.log(age.type());
        await page.waitFor(3e2);
        console.log(age.message());
        await age.dismiss()
    });
    await page.goto('https://infosimples.github.io/detect-headless/');
    await page.waitFor(3e2);
    await page.mouse.move(50, 50, { steps: 50 });
    await page.screenshot({
        path: './' + Date.now() + '.png',
        fullPage: true,
    });
    // await browser.close();
    console.log('end');

}
async function pageInit(browser) {
    var page, pages = await browser.pages();
    if (pages.length > 0) {
        page = pages[0];
    } else {
        page = await browser.newPage();
    }
    await page.setExtraHTTPHeaders({
        'Accept-Language': 'zh-CN,zh;q=0.9'
    });

    //User-Agent Test
    await page.setUserAgent('Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36');
    await page.evaluateOnNewDocument(() => {
        //Webdriver Test
        Object.defineProperty(navigator, 'webdriver', {
            get: () => false,
        });
        //connection.rtt Test
        Object.defineProperty(navigator.connection, 'rtt', {
            get: () => 50,
        });
        //Plugins Length Test
        Object.defineProperty(navigator, 'plugins', {
            get: () => {
                var ChromiumPDFPlugin = {};
                ChromiumPDFPlugin.__proto__ = PluginArray.prototype;
                return [ChromiumPDFPlugin];
            },
        });
    });

    //Chrome Test
    const trueChromeObject = { "app": { "isInstalled": false }, "webstore": { "onInstallStageChanged": {}, "onDownloadProgress": {} }, "runtime": { "PlatformOs": { "MAC": "mac", "WIN": "win", "ANDROID": "android", "CROS": "cros", "LINUX": "linux", "OPENBSD": "openbsd" }, "PlatformArch": { "ARM": "arm", "X86_32": "x86-32", "X86_64": "x86-64" }, "PlatformNaclArch": { "ARM": "arm", "X86_32": "x86-32", "X86_64": "x86-64" }, "RequestUpdateCheckStatus": { "THROTTLED": "throttled", "NO_UPDATE": "no_update", "UPDATE_AVAILABLE": "update_available" }, "OnInstalledReason": { "INSTALL": "install", "UPDATE": "update", "CHROME_UPDATE": "chrome_update", "SHARED_MODULE_UPDATE": "shared_module_update" }, "OnRestartRequiredReason": { "APP_UPDATE": "app_update", "OS_UPDATE": "os_update", "PERIODIC": "periodic" } } };
    await page.evaluateOnNewDocument(() => {
        chrome = { "app": { "isInstalled": false }, "webstore": { "onInstallStageChanged": {}, "onDownloadProgress": {} }, "runtime": { "PlatformOs": { "MAC": "mac", "WIN": "win", "ANDROID": "android", "CROS": "cros", "LINUX": "linux", "OPENBSD": "openbsd" }, "PlatformArch": { "ARM": "arm", "X86_32": "x86-32", "X86_64": "x86-64" }, "PlatformNaclArch": { "ARM": "arm", "X86_32": "x86-32", "X86_64": "x86-64" }, "RequestUpdateCheckStatus": { "THROTTLED": "throttled", "NO_UPDATE": "no_update", "UPDATE_AVAILABLE": "update_available" }, "OnInstalledReason": { "INSTALL": "install", "UPDATE": "update", "CHROME_UPDATE": "chrome_update", "SHARED_MODULE_UPDATE": "shared_module_update" }, "OnRestartRequiredReason": { "APP_UPDATE": "app_update", "OS_UPDATE": "os_update", "PERIODIC": "periodic" } } };
        window.chrome = { "app": { "isInstalled": false }, "webstore": { "onInstallStageChanged": {}, "onDownloadProgress": {} }, "runtime": { "PlatformOs": { "MAC": "mac", "WIN": "win", "ANDROID": "android", "CROS": "cros", "LINUX": "linux", "OPENBSD": "openbsd" }, "PlatformArch": { "ARM": "arm", "X86_32": "x86-32", "X86_64": "x86-64" }, "PlatformNaclArch": { "ARM": "arm", "X86_32": "x86-32", "X86_64": "x86-64" }, "RequestUpdateCheckStatus": { "THROTTLED": "throttled", "NO_UPDATE": "no_update", "UPDATE_AVAILABLE": "update_available" }, "OnInstalledReason": { "INSTALL": "install", "UPDATE": "update", "CHROME_UPDATE": "chrome_update", "SHARED_MODULE_UPDATE": "shared_module_update" }, "OnRestartRequiredReason": { "APP_UPDATE": "app_update", "OS_UPDATE": "os_update", "PERIODIC": "periodic" } } };
        window.navigator.chrome = { "app": { "isInstalled": false }, "webstore": { "onInstallStageChanged": {}, "onDownloadProgress": {} }, "runtime": { "PlatformOs": { "MAC": "mac", "WIN": "win", "ANDROID": "android", "CROS": "cros", "LINUX": "linux", "OPENBSD": "openbsd" }, "PlatformArch": { "ARM": "arm", "X86_32": "x86-32", "X86_64": "x86-64" }, "PlatformNaclArch": { "ARM": "arm", "X86_32": "x86-32", "X86_64": "x86-64" }, "RequestUpdateCheckStatus": { "THROTTLED": "throttled", "NO_UPDATE": "no_update", "UPDATE_AVAILABLE": "update_available" }, "OnInstalledReason": { "INSTALL": "install", "UPDATE": "update", "CHROME_UPDATE": "chrome_update", "SHARED_MODULE_UPDATE": "shared_module_update" }, "OnRestartRequiredReason": { "APP_UPDATE": "app_update", "OS_UPDATE": "os_update", "PERIODIC": "periodic" } } };
    });

    //Permissions Test
    await page.evaluateOnNewDocument(() => {
        const originalQuery = window.navigator.permissions.query;
        return window.navigator.permissions.query = (parameters) => (
            parameters.name === 'notifications' ? Promise.resolve({ state: Notification.permission }) :
                originalQuery(parameters)
        );
    });

    //Languages Test
    await page.evaluateOnNewDocument(() => {
        Object.defineProperty(navigator, 'languages', {
            get: () => ['zh-CN'],
        });
    });
    return page;
}
test();

Does the rule: navigator.connection.rtt == 0 possibly cause false positives for some cases like Edge?

We have observed that 2%-3% Edge traffic that has navigator.connection.rtt set to 0. It's much higher than other headless signals. So I wonder if there can possibly be any false positives for the rule: navigator.connection.rtt == 0 on Edge browsers?

Actually I searched around the Internet, but didn't find a strong evidence to prove that navigator.connection.rtt == 0 indicates a headless bot, except here. Any answers would be appreciated. Thanks!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.