UNPKG

@ch1/browser-dna-express

Version:

Browser DNA Express is a tool for fingerprinting browsers with express

74 lines (69 loc) 2.7 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var utility = require('@ch1/utility'); function fingerprint() { return (req, res, next) => { connectionFingerprint(req, res, utility.noop); serverFingerprint(req, res, utility.noop); if (req.method !== 'OPTIONS') { clientFingerprint(req, res, utility.noop); } next(); }; } function connectionFingerprint(req, res, next) { const connectionFingerprint = { ip: cleanExpressIp(req.ip), referrer: utility.toStringMax(2000, req.get('Referer')), method: utility.toStringMax(16, req.method) }; req.fingerprint = req.fingerprint || {}; req.fingerprint.connection = connectionFingerprint; res.locals.fingerprint = res.locals.fingerprint || {}; res.locals.fingerprint.connection = connectionFingerprint; next(); } function serverFingerprint(req, res, next) { const serverFingerprint = { language: utility.toStringMax(64, req.get('Accept-Language')), userAgent: utility.toStringMax(512, req.get('User-Agent')), usesDnt: parseInt(utility.toString(req.get('DNT')), 10) ? true : false }; req.fingerprint = req.fingerprint || {}; req.fingerprint.server = serverFingerprint; res.locals.fingerprint = res.locals.fingerprint || {}; res.locals.fingerprint.server = serverFingerprint; next(); } function clientFingerprint(req, res, next) { if (!req.body.fingerprint) { next(); return; } const fp = req.body.fingerprint; const clientFingerprint = { browserDepth: utility.toGtZeroIntMax(50000, fp.browserDepth), browserHeight: utility.toGtZeroIntMax(50000, fp.browserHeight), browserWidth: utility.toGtZeroIntMax(50000, fp.browserWidth), concurrency: utility.toGtZeroIntMax(512, fp.concurrency), os: utility.toStringMax(32, fp.os), plugins: utility.toStringArrayMax(25, fp.plugins), tzOffset: parseInt(fp.tzOffset, 10), usesCookies: fp.usesCookies ? true : false, usesTouch: fp.usesTouch ? true : false }; req.fingerprint = req.fingerprint || {}; req.fingerprint.client = clientFingerprint; res.locals.fingerprint = res.locals.fingerprint || {}; res.locals.fingerprint.client = clientFingerprint; next(); } function cleanExpressIp(ip) { const splits = ip.split(':').filter(Boolean); return splits[splits.length - 1]; } exports.fingerprint = fingerprint; exports.connectionFingerprint = connectionFingerprint; exports.serverFingerprint = serverFingerprint; exports.clientFingerprint = clientFingerprint; exports.cleanExpressIp = cleanExpressIp;