@ch1/browser-dna-express
Version:
Browser DNA Express is a tool for fingerprinting browsers with express
63 lines • 2.42 kB
JavaScript
import { noop, toGtZeroIntMax, toString, toStringArrayMax, toStringMax } from '@ch1/utility';
export function fingerprint() {
return (req, res, next) => {
connectionFingerprint(req, res, noop);
serverFingerprint(req, res, noop);
if (req.method !== 'OPTIONS') {
clientFingerprint(req, res, noop);
}
next();
};
}
export function connectionFingerprint(req, res, next) {
const connectionFingerprint = {
ip: cleanExpressIp(req.ip),
referrer: toStringMax(2000, req.get('Referer')),
method: toStringMax(16, req.method)
};
req.fingerprint = req.fingerprint || {};
req.fingerprint.connection = connectionFingerprint;
res.locals.fingerprint = res.locals.fingerprint || {};
res.locals.fingerprint.connection = connectionFingerprint;
next();
}
export function serverFingerprint(req, res, next) {
const serverFingerprint = {
language: toStringMax(64, req.get('Accept-Language')),
userAgent: toStringMax(512, req.get('User-Agent')),
usesDnt: parseInt(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();
}
export function clientFingerprint(req, res, next) {
if (!req.body.fingerprint) {
next();
return;
}
const fp = req.body.fingerprint;
const clientFingerprint = {
browserDepth: toGtZeroIntMax(50000, fp.browserDepth),
browserHeight: toGtZeroIntMax(50000, fp.browserHeight),
browserWidth: toGtZeroIntMax(50000, fp.browserWidth),
concurrency: toGtZeroIntMax(512, fp.concurrency),
os: toStringMax(32, fp.os),
plugins: 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();
}
export function cleanExpressIp(ip) {
const splits = ip.split(':').filter(Boolean);
return splits[splits.length - 1];
}
//# sourceMappingURL=browser-dna-express.js.map