UNPKG

express-cloudflare-ip

Version:

Tool to extract real ip for cloudflare reverse proxy

73 lines 2.3 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.expressCloudflareIp = void 0; const ip_range_check_1 = __importDefault(require("ip-range-check")); const net_1 = __importDefault(require("net")); const defaultExpressCloudflareOptions = (opts) => { const defaultOpts = { cloudflareHeader: "x-forwarded-for", }; return Object.assign(defaultOpts, opts || {}); }; const sanitizeIfIpV4 = (ip) => { if (typeof ip !== "string") return ip; if (ip.startsWith("::ffff:")) return ip.slice(7); return ip; }; const extractRequestIp = (req) => { return req.ip; }; const fromCloudflare = (ip, family) => { const cloudflareIpRanges = { 4: [ "103.21.244.0/22", "103.22.200.0/22", "103.31.4.0/22", "104.16.0.0/13", "104.24.0.0/14", "108.162.192.0/18", "131.0.72.0/22", "141.101.64.0/18", "162.158.0.0/15", "172.64.0.0/13", "173.245.48.0/20", "188.114.96.0/20", "190.93.240.0/20", "197.234.240.0/22", "198.41.128.0/17", ], 6: [ "2400:cb00::/32", "2606:4700::/32", "2803:f800::/32", "2405:b500::/32", "2405:8100::/32", "2a06:98c0::/29", "2c0f:f248::/32", ], }; return !!(0, ip_range_check_1.default)(ip, cloudflareIpRanges[family.toString()]); }; const expressCloudflareIp = (opts) => { const fullOpts = defaultExpressCloudflareOptions(opts); return (req, _res, next) => { const ip = extractRequestIp(req); const reqIp = sanitizeIfIpV4(ip); if (!reqIp) return next(); const ipFromCloudflare = req.header(fullOpts.cloudflareHeader); const ipFamily = net_1.default.isIP(reqIp); const fromCf = fromCloudflare(reqIp, ipFamily); if (fromCf) { req.cloudflareIp = ipFromCloudflare; } next(); }; }; exports.expressCloudflareIp = expressCloudflareIp; //# sourceMappingURL=index.js.map