@ch1/browser-dna-express
Version:
Browser DNA Express is a tool for fingerprinting browsers with express
74 lines (69 loc) • 2.7 kB
JavaScript
;
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;