webarmor 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2199 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +281 -0
- package/dist/index.d.ts +281 -0
- package/dist/index.js +2162 -0
- package/dist/index.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/modules/ddos/DDoSProtection.ts","../src/modules/ratelimit/RateLimiter.ts","../src/modules/security-headers/SecurityHeaders.ts","../src/modules/cors/CORSManager.ts","../src/modules/xss/XSSProtection.ts","../src/modules/csrf/CSRFProtection.ts","../src/modules/sql-injection/SQLInjectionProtection.ts","../src/modules/bot-protection/BotProtection.ts","../src/modules/ip-filter/IPFilter.ts","../src/modules/file-block/FileBlocker.ts","../src/index.ts","../src/core/Config.ts","../src/core/Logger.ts","../src/core/Shield.ts","../src/encryption/FileEncryptor.ts","../src/encryption/ConfigEncryptor.ts","../src/encryption/DatabaseEncryptor.ts","../src/encryption/SessionEncryptor.ts"],"sourcesContent":["import { DDoSConfig } from '../core/Config.js';\nimport Logger from '../core/Logger.js';\nimport type { RequestData } from '../core/Shield.js';\n\ninterface IPRequestData {\n count: number;\n firstRequest: number;\n lastRequest: number;\n blocked: boolean;\n blockUntil?: number;\n score: number;\n}\n\nclass DDoSProtection {\n private config: Required<DDoSConfig>;\n private logger: Logger;\n private ipMap: Map<string, IPRequestData> = new Map();\n private cleanupInterval: NodeJS.Timeout | null = null;\n\n constructor(config: Partial<DDoSConfig>, logger: Logger) {\n this.config = config as Required<DDoSConfig>;\n this.logger = logger;\n this.startCleanup();\n }\n\n private startCleanup(): void {\n this.cleanupInterval = setInterval(() => {\n const now = Date.now();\n for (const [ip, data] of this.ipMap.entries()) {\n if (data.blocked && data.blockUntil && now > data.blockUntil) {\n data.blocked = false;\n data.blockUntil = undefined;\n this.logger.info(`IP ${ip} unblocked after DDoS protection`);\n }\n if (now - data.lastRequest > this.config.windowMs * 2) {\n this.ipMap.delete(ip);\n }\n }\n }, 60000);\n }\n\n async check(data: RequestData): Promise<{ allowed: boolean; reason?: string }> {\n const ip = data.ip || 'unknown';\n const now = Date.now();\n\n let ipData = this.ipMap.get(ip);\n\n if (!ipData) {\n ipData = {\n count: 0,\n firstRequest: now,\n lastRequest: now,\n blocked: false,\n score: 0,\n };\n this.ipMap.set(ip, ipData);\n }\n\n if (ipData.blocked && ipData.blockUntil && now < ipData.blockUntil) {\n return {\n allowed: false,\n reason: `DDoS protection: IP temporarily blocked until ${new Date(ipData.blockUntil).toISOString()}`,\n };\n }\n\n ipData.count++;\n ipData.lastRequest = now;\n\n const windowStart = now - this.config.windowMs;\n const requestsInWindow = ipData.count;\n\n if (requestsInWindow > this.config.maxRequests) {\n ipData.blocked = true;\n ipData.blockUntil = now + this.config.blockDurationMs;\n ipData.score += 10;\n\n this.logger.warn(`DDoS detected from IP ${ip}`, {\n requestsInWindow,\n maxRequests: this.config.maxRequests,\n blocked: true,\n });\n\n return {\n allowed: false,\n reason: 'DDoS protection: Too many requests',\n };\n }\n\n ipData.score = Math.max(0, ipData.score - 1);\n\n if (ipData.score > this.config.scoreThreshold) {\n ipData.blocked = true;\n ipData.blockUntil = now + this.config.blockDurationMs;\n\n this.logger.warn(`High risk score for IP ${ip}`, {\n score: ipData.score,\n threshold: this.config.scoreThreshold,\n });\n\n return {\n allowed: false,\n reason: 'DDoS protection: High risk score',\n };\n }\n\n return { allowed: true };\n }\n\n getStats(): any {\n const now = Date.now();\n let active = 0;\n let blocked = 0;\n\n for (const data of this.ipMap.values()) {\n if (!data.blocked || (data.blockUntil && now < data.blockUntil)) {\n active++;\n }\n if (data.blocked) {\n blocked++;\n }\n }\n\n return {\n totalTracked: this.ipMap.size,\n activeConnections: active,\n blockedIPs: blocked,\n };\n }\n\n middleware() {\n return async (req: any, res: any, next: any) => {\n const ip = req.ip || req.connection?.remoteAddress || req.headers?.['x-forwarded-for'] || 'unknown';\n const data: RequestData = {\n ip,\n method: req.method,\n url: req.url,\n headers: req.headers,\n body: req.body,\n userAgent: req.headers?.['user-agent'],\n };\n\n const result = await this.check(data);\n\n if (!result.allowed) {\n return res.status(403).json({\n error: 'Forbidden',\n message: result.reason,\n });\n }\n\n next();\n };\n }\n\n destroy(): void {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval);\n }\n this.ipMap.clear();\n }\n}\n\nexport default DDoSProtection;\nexport { DDoSProtection };\n","import { RateLimitConfig } from '../core/Config.js';\nimport Logger from '../core/Logger.js';\n\ninterface RateLimitData {\n tokens: number;\n lastRefill: number;\n}\n\nclass RateLimiter {\n private config: Required<RateLimitConfig>;\n private logger: Logger;\n private limits: Map<string, RateLimitData> = new Map();\n private refillInterval: NodeJS.Timeout | null = null;\n\n constructor(config: Partial<RateLimitConfig>, logger: Logger) {\n this.config = config as Required<RateLimitConfig>;\n this.logger = logger;\n this.startRefill();\n }\n\n private startRefill(): void {\n this.refillInterval = setInterval(() => {\n const now = Date.now();\n for (const [key, data] of this.limits.entries()) {\n const refillAmount = (now - data.lastRefill) / this.config.windowMs * this.config.max;\n data.tokens = Math.min(this.config.max, data.tokens + refillAmount);\n data.lastRefill = now;\n\n if (data.tokens >= this.config.max && now - data.lastRefill > this.config.windowMs * 2) {\n this.limits.delete(key);\n }\n }\n }, 1000);\n }\n\n async check(key: string): Promise<{ allowed: boolean; reason?: string; remaining?: number }> {\n const now = Date.now();\n let data = this.limits.get(key);\n\n if (!data) {\n data = {\n tokens: this.config.max - 1,\n lastRefill: now,\n };\n this.limits.set(key, data);\n return { allowed: true, remaining: data.tokens };\n }\n\n const refillAmount = (now - data.lastRefill) / this.config.windowMs * this.config.max;\n data.tokens = Math.min(this.config.max, data.tokens + refillAmount);\n data.lastRefill = now;\n\n if (data.tokens < 1) {\n this.logger.warn(`Rate limit exceeded for key: ${key}`);\n return {\n allowed: false,\n reason: this.config.message || 'Too many requests',\n remaining: 0,\n };\n }\n\n data.tokens -= 1;\n return { allowed: true, remaining: Math.floor(data.tokens) };\n }\n\n middleware() {\n return async (req: any, res: any, next: any) => {\n const key = this.config.keyGenerator \n ? this.config.keyGenerator(req)\n : (req.ip || req.connection?.remoteAddress || 'unknown');\n\n const result = await this.check(key);\n\n res.setHeader('X-RateLimit-Limit', this.config.max);\n res.setHeader('X-RateLimit-Remaining', result.remaining ?? 0);\n\n if (!result.allowed) {\n return res.status(this.config.statusCode || 429).json({\n error: 'Too Many Requests',\n message: result.reason,\n });\n }\n\n next();\n };\n }\n\n getStats(): any {\n return {\n activeKeys: this.limits.size,\n };\n }\n\n reset(key?: string): void {\n if (key) {\n this.limits.delete(key);\n } else {\n this.limits.clear();\n }\n }\n\n destroy(): void {\n if (this.refillInterval) {\n clearInterval(this.refillInterval);\n }\n this.limits.clear();\n }\n}\n\nexport default RateLimiter;\nexport { RateLimiter };\n","import { SecurityHeadersConfig } from '../core/Config.js';\nimport Logger from '../core/Logger.js';\n\nclass SecurityHeaders {\n private config: Required<SecurityHeadersConfig>;\n private logger: Logger;\n\n constructor(config: Partial<SecurityHeadersConfig>, logger: Logger) {\n this.config = config as Required<SecurityHeadersConfig>;\n this.logger = logger;\n }\n\n private buildCSP(): string {\n const csp = this.config.contentSecurityPolicy;\n if (!csp) return '';\n\n const parts: string[] = [];\n\n if (csp.defaultSrc) parts.push(`default-src ${csp.defaultSrc.join(' ')}`);\n if (csp.scriptSrc) parts.push(`script-src ${csp.scriptSrc.join(' ')}`);\n if (csp.styleSrc) parts.push(`style-src ${csp.styleSrc.join(' ')}`);\n if (csp.imgSrc) parts.push(`img-src ${csp.imgSrc.join(' ')}`);\n if (csp.connectSrc) parts.push(`connect-src ${csp.connectSrc.join(' ')}`);\n if (csp.fontSrc) parts.push(`font-src ${csp.fontSrc.join(' ')}`);\n if (csp.objectSrc) parts.push(`object-src ${csp.objectSrc.join(' ')}`);\n if (csp.mediaSrc) parts.push(`media-src ${csp.mediaSrc.join(' ')}`);\n if (csp.frameSrc) parts.push(`frame-src ${csp.frameSrc.join(' ')}`);\n\n return parts.join('; ');\n }\n\n private buildHSTS(): string {\n const hsts = this.config.hsts;\n if (!hsts || !hsts.enabled) return '';\n\n let value = `max-age=${hsts.maxAge}`;\n if (hsts.includeSubDomains) value += '; includeSubDomains';\n if (hsts.preload) value += '; preload';\n\n return value;\n }\n\n middleware() {\n return (req: any, res: any, next: any) => {\n if (this.config.xFrameOptions) {\n res.setHeader('X-Frame-Options', this.config.xFrameOptions);\n }\n\n if (this.config.xContentTypeOptions) {\n res.setHeader('X-Content-Type-Options', this.config.xContentTypeOptions);\n }\n\n if (this.config.xssProtection) {\n res.setHeader('X-XSS-Protection', this.config.xssProtection);\n }\n\n if (this.config.referrerPolicy) {\n res.setHeader('Referrer-Policy', this.config.referrerPolicy);\n }\n\n if (this.config.contentSecurityPolicy) {\n const csp = this.buildCSP();\n if (csp) {\n res.setHeader('Content-Security-Policy', csp);\n }\n }\n\n if (this.config.hsts && this.config.hsts.enabled) {\n const hsts = this.buildHSTS();\n if (hsts) {\n res.setHeader('Strict-Transport-Security', hsts);\n }\n }\n\n if (this.config.permissionsPolicy && Object.keys(this.config.permissionsPolicy).length > 0) {\n const permissions = Object.entries(this.config.permissionsPolicy)\n .map(([key, value]) => `${key}=(${value.join(' ')})`)\n .join(', ');\n res.setHeader('Permissions-Policy', permissions);\n }\n\n res.setHeader('X-Permitted-Cross-Domain-Policies', 'none');\n res.setHeader('X-Download-Options', 'noopen');\n\n next();\n };\n }\n\n getConfig(): Required<SecurityHeadersConfig> {\n return this.config;\n }\n}\n\nexport default SecurityHeaders;\nexport { SecurityHeaders };\n","import { CORSConfig } from '../core/Config.js';\nimport Logger from '../core/Logger.js';\n\nclass CORSManager {\n private config: Required<CORSConfig>;\n private logger: Logger;\n\n constructor(config: Partial<CORSConfig>, logger: Logger) {\n this.config = config as Required<CORSConfig>;\n this.logger = logger;\n }\n\n private isOriginAllowed(origin: string | undefined): boolean {\n if (!origin) return this.config.origins.includes('*');\n\n return this.config.origins.some(allowed => {\n if (allowed === '*') return true;\n if (allowed === origin) return true;\n \n if (allowed.startsWith('*.')) {\n const base = allowed.slice(2);\n return origin.endsWith(base);\n }\n \n if (allowed.includes('*')) {\n const regex = new RegExp('^' + allowed.replace(/\\./g, '\\\\.').replace(/\\*/g, '.*') + '$');\n return regex.test(origin);\n }\n \n return false;\n });\n }\n\n middleware() {\n return (req: any, res: any, next: any) => {\n const origin = req.headers.origin || req.headers.referer;\n const method = req.method;\n\n if (method === 'OPTIONS') {\n if (this.isOriginAllowed(origin)) {\n if (this.config.credentials) {\n res.setHeader('Access-Control-Allow-Origin', origin || '*');\n } else {\n res.setHeader('Access-Control-Allow-Origin', this.config.origins.includes('*') ? '*' : origin || '');\n }\n res.setHeader('Access-Control-Allow-Methods', this.config.methods?.join(', ') || 'GET, POST, PUT, DELETE, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', this.config.allowedHeaders?.join(', ') || 'Content-Type, Authorization');\n res.setHeader('Access-Control-Allow-Credentials', String(this.config.credentials));\n \n if (this.config.maxAge) {\n res.setHeader('Access-Control-Max-Age', String(this.config.maxAge));\n }\n\n if (this.config.exposedHeaders?.length) {\n res.setHeader('Access-Control-Expose-Headers', this.config.exposedHeaders.join(', '));\n }\n\n if (this.config.preflightContinue) {\n return next();\n }\n\n return res.status(204).end();\n }\n\n return res.status(403).json({ error: 'CORS: Origin not allowed' });\n }\n\n if (this.isOriginAllowed(origin)) {\n if (this.config.credentials) {\n res.setHeader('Access-Control-Allow-Origin', origin || '*');\n } else {\n res.setHeader('Access-Control-Allow-Origin', this.config.origins.includes('*') ? '*' : origin || '');\n }\n \n if (this.config.credentials) {\n res.setHeader('Access-Control-Allow-Credentials', 'true');\n }\n\n if (this.config.exposedHeaders?.length) {\n res.setHeader('Access-Control-Expose-Headers', this.config.exposedHeaders.join(', '));\n }\n }\n\n next();\n };\n }\n\n addOrigin(origin: string): void {\n if (!this.config.origins.includes(origin)) {\n this.config.origins.push(origin);\n this.logger.info(`Added CORS origin: ${origin}`);\n }\n }\n\n removeOrigin(origin: string): void {\n const index = this.config.origins.indexOf(origin);\n if (index > -1) {\n this.config.origins.splice(index, 1);\n this.logger.info(`Removed CORS origin: ${origin}`);\n }\n }\n\n getConfig(): Required<CORSConfig> {\n return this.config;\n }\n}\n\nexport default CORSManager;\nexport { CORSManager };\n","import { XSSConfig } from '../core/Config.js';\nimport Logger from '../core/Logger.js';\n\nclass XSSProtection {\n private config: Required<XSSConfig>;\n private logger: Logger;\n\n private patterns: Record<string, RegExp> = {\n low: /<script|javascript:|on\\w+\\s*=/i,\n medium: /<script|javascript:|on\\w+\\s*=|<iframe|<object|<embed|eval\\(|innerHTML|outerHTML/i,\n strict: /<script|javascript:|on\\w+\\s*=|<iframe|<object|<embed|<embed|<applet|<meta|<link|<style|<body|<img|<input|<form|<select|<textarea|<datalist|<keygen|<output|<details|<dialog|<menu|<menuitem|eval\\(|innerHTML|outerHTML|document\\.|window\\.|alert\\(|confirm\\(|prompt\\(/i,\n };\n\n private customRules: Array<{ pattern: RegExp; name: string }> = [];\n\n constructor(config: Partial<XSSConfig>, logger: Logger) {\n this.config = config as Required<XSSConfig>;\n this.logger = logger;\n\n if (this.config.customRules) {\n for (const [name, pattern] of Object.entries(this.config.customRules)) {\n this.customRules.push({ pattern: new RegExp(pattern, 'i'), name });\n }\n }\n }\n\n private sanitizeString(str: string): string {\n if (typeof str !== 'string') return str;\n\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(/\\//g, '/');\n }\n\n check(data: any): { allowed: boolean; reason?: string; sanitized?: any } {\n const result = this.deepCheck(data);\n \n if (result.detected) {\n this.logger.warn('XSS attempt detected', {\n patterns: result.patterns,\n level: this.config.level,\n });\n\n if (this.config.level === 'strict') {\n return {\n allowed: false,\n reason: `XSS protection: Suspicious input detected - ${result.patterns.join(', ')}`,\n };\n }\n }\n\n return { allowed: true };\n }\n\n private deepCheck(obj: any, path: string = ''): { detected: boolean; patterns: string[] } {\n if (obj === null || obj === undefined) {\n return { detected: false, patterns: [] };\n }\n\n if (typeof obj === 'string') {\n return this.checkString(obj, path);\n }\n\n if (typeof obj === 'object') {\n const patterns: string[] = [];\n let detected = false;\n\n for (const key of Object.keys(obj)) {\n const result = this.deepCheck(obj[key], path ? `${path}.${key}` : key);\n if (result.detected) {\n detected = true;\n patterns.push(...result.patterns);\n }\n }\n\n return { detected, patterns };\n }\n\n return { detected: false, patterns: [] };\n }\n\n private checkString(str: string, path: string): { detected: boolean; patterns: string[] } {\n const patterns: string[] = [];\n const basePattern = this.patterns[this.config.level];\n\n if (basePattern.test(str)) {\n patterns.push(`base-${this.config.level}`);\n }\n\n for (const rule of this.customRules) {\n if (rule.pattern.test(str)) {\n patterns.push(rule.name);\n }\n }\n\n return { detected: patterns.length > 0, patterns };\n }\n\n sanitize(data: any): any {\n if (typeof data === 'string') {\n return this.sanitizeString(data);\n }\n\n if (Array.isArray(data)) {\n return data.map(item => this.sanitize(item));\n }\n\n if (typeof data === 'object' && data !== null) {\n const sanitized: any = {};\n for (const [key, value] of Object.entries(data)) {\n sanitized[key] = this.sanitize(value);\n }\n return sanitized;\n }\n\n return data;\n }\n\n middleware() {\n return (req: any, res: any, next: any) => {\n if (req.body) {\n const result = this.check(req.body);\n if (!result.allowed) {\n return res.status(400).json({\n error: 'Bad Request',\n message: result.reason,\n });\n }\n\n req.body = this.sanitize(req.body);\n }\n\n if (req.query) {\n const result = this.check(req.query);\n if (!result.allowed) {\n return res.status(400).json({\n error: 'Bad Request',\n message: result.reason,\n });\n }\n }\n\n next();\n };\n }\n\n addCustomRule(name: string, pattern: string): void {\n this.customRules.push({ pattern: new RegExp(pattern, 'i'), name });\n }\n\n getConfig(): Required<XSSConfig> {\n return this.config;\n }\n}\n\nexport default XSSProtection;\nexport { XSSProtection };\n","import { CSRFConfig } from '../core/Config.js';\nimport Logger from '../core/Logger.js';\nimport crypto from 'crypto';\n\nclass CSRFProtection {\n private config: Required<CSRFConfig>;\n private logger: Logger;\n private tokens: Map<string, string> = new Map();\n private cleanupInterval: NodeJS.Timeout | null = null;\n\n constructor(config: Partial<CSRFConfig>, logger: Logger) {\n this.config = config as Required<CSRFConfig>;\n this.logger = logger;\n this.startCleanup();\n }\n\n private startCleanup(): void {\n this.cleanupInterval = setInterval(() => {\n const now = Date.now();\n const expiryMs = 3600000;\n\n for (const [key, token] of this.tokens.entries()) {\n if (now - this.hashToTimestamp(token) > expiryMs) {\n this.tokens.delete(key);\n }\n }\n }, 300000);\n }\n\n private hashToTimestamp(token: string): number {\n const hash = token.substring(0, 8);\n return parseInt(hash, 16) * 1000;\n }\n\n generateToken(sessionId: string): string {\n const timestamp = Math.floor(Date.now() / 1000).toString(16);\n const random = crypto.randomBytes(this.config.tokenLength || 32).toString('hex');\n const token = timestamp + random;\n this.tokens.set(sessionId, token);\n return token;\n }\n\n validateToken(token: string, sessionId: string): boolean {\n const storedToken = this.tokens.get(sessionId);\n if (!storedToken) return false;\n\n if (storedToken !== token) {\n this.logger.warn('CSRF token mismatch', { sessionId });\n return false;\n }\n\n const tokenTimestamp = this.hashToTimestamp(token);\n const now = Date.now();\n const maxAge = 3600000;\n\n if (now - tokenTimestamp > maxAge) {\n this.logger.warn('CSRF token expired', { sessionId });\n this.tokens.delete(sessionId);\n return false;\n }\n\n return true;\n }\n\n middleware() {\n return (req: any, res: any, next: any) => {\n const sessionId = req.session?.id || req.headers['x-session-id'] || req.ip;\n\n if (req.method === 'GET' || req.method === 'HEAD' || req.method === 'OPTIONS') {\n const token = this.generateToken(sessionId);\n \n if (this.config.cookie) {\n res.cookie(this.config.cookie.name || '_csrf', token, {\n httpOnly: this.config.cookie.httpOnly !== false,\n secure: this.config.cookie.secure !== false,\n sameSite: this.config.cookie.sameSite || 'strict',\n maxAge: 3600000,\n });\n }\n\n res.locals.csrfToken = token;\n return next();\n }\n\n const token = req.body?.csrf || \n req.headers['x-csrf-token'] || \n req.headers['x-xsrf-token'];\n\n if (!token) {\n this.logger.warn('CSRF token missing', { \n method: req.method,\n path: req.path,\n });\n \n return res.status(403).json({\n error: 'Forbidden',\n message: 'CSRF token missing',\n });\n }\n\n if (!this.validateToken(token, sessionId)) {\n return res.status(403).json({\n error: 'Forbidden',\n message: 'Invalid or expired CSRF token',\n });\n }\n\n next();\n };\n }\n\n getToken(sessionId: string): string {\n return this.generateToken(sessionId);\n }\n\n destroy(): void {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval);\n }\n this.tokens.clear();\n }\n}\n\nexport default CSRFProtection;\nexport { CSRFProtection };\n","import { SQLInjectionConfig } from '../core/Config.js';\nimport Logger from '../core/Logger.js';\nimport type { RequestData } from '../core/Shield.js';\n\nclass SQLInjectionProtection {\n private config: Required<SQLInjectionConfig>;\n private logger: Logger;\n private customPatterns: RegExp[] = [];\n\n private defaultPatterns: RegExp[] = [\n /(\\b(SELECT|INSERT|UPDATE|DELETE|DROP|UNION|ALTER|CREATE|TRUNCATE)\\b.*\\b(FROM|INTO|TABLE|DATABASE)\\b)/i,\n /((\\%27)|(\\'))((\\%6F)|o|(\\%4F))((\\%72)|r|(\\%52))/i,\n /((\\%27)|(\\'))((\\%6F)|o|(\\%4F))((\\%72)|r|(\\%52))/i,\n /((\\%27)|(\\'))\\s*((\\%6F)|o|(\\%4F))((\\%72)|r|(\\%52))/i,\n /(char\\s*\\(\\s*\\d+\\s*\\))/i,\n /(\\%77here\\s+\\w+\\s*=\\s*\\w+)/i,\n /(\\hre\\b.*\\b\\w+\\s*=\\s*\\w+)/i,\n /(union\\s+select\\s+)/i,\n /(union\\s+all\\s+select\\s+)/i,\n /(select\\s+.*\\s+from\\s+)/i,\n /(insert\\s+into\\s+)/i,\n /(delete\\s+from\\s+)/i,\n /(update\\s+.*\\s+set\\s+)/i,\n /(drop\\s+table\\s+)/i,\n /(drop\\s+database\\s+)/i,\n /(exec\\s*\\(|execute\\s*\\(|xp_)/i,\n /(0x[0-9a-fA-F]+)/i,\n /(\\bOR\\b\\s+\\b\\d+\\s*=\\s*\\d+)/i,\n /(\\bAND\\b\\s+\\b\\d+\\s*=\\s*\\d+)/i,\n /(\\'\\s*OR\\s*\\'\\s*\\'\\s*=\\s*\\'\\s*)/i,\n /(\\'\\s*OR\\s+\\w+\\s*=\\s*\\w+)/i,\n /(--\\s*$)/m,\n /(;\\s*drop\\s+)/i,\n /(;\\s*exec\\s+)/i,\n /(\\/\\*.*\\*\\/)/,\n /(\\bhaving\\b\\s+\\w+\\s*[=<>])/i,\n /(\\blimit\\b\\s+\\d+(,\\s*\\d+)?)/i,\n ];\n\n constructor(config: Partial<SQLInjectionConfig>, logger: Logger) {\n this.config = config as Required<SQLInjectionConfig>;\n this.logger = logger;\n\n if (this.config.customPatterns) {\n for (const pattern of this.config.customPatterns) {\n this.customPatterns.push(new RegExp(pattern, 'i'));\n }\n }\n }\n\n check(data: RequestData): { allowed: boolean; reason?: string; detected?: string } {\n const allInput = this.extractInput(data);\n const detectedPatterns: string[] = [];\n\n for (const input of allInput) {\n if (typeof input !== 'string') continue;\n\n for (const pattern of this.defaultPatterns) {\n if (pattern.test(input)) {\n detectedPatterns.push(`default-${pattern.toString()}`);\n }\n }\n\n for (const pattern of this.customPatterns) {\n if (pattern.test(input)) {\n detectedPatterns.push(`custom-${pattern.toString()}`);\n }\n }\n\n if (this.hasSuspiciousPatterns(input)) {\n detectedPatterns.push('suspicious-comments-union');\n }\n }\n\n if (detectedPatterns.length > 0) {\n this.logger.warn('SQL Injection attempt detected', {\n ip: data.ip,\n url: data.url,\n patterns: detectedPatterns,\n });\n\n if (this.config.blockOnDetect || !this.config.logOnly) {\n return {\n allowed: false,\n reason: 'SQL Injection protection: Suspicious input detected',\n detected: detectedPatterns.join(', '),\n };\n }\n }\n\n return { allowed: true };\n }\n\n private extractInput(data: RequestData): string[] {\n const inputs: string[] = [];\n\n if (data.body) {\n inputs.push(...this.flattenObject(data.body));\n }\n\n if (data.url) {\n const url = new URL(data.url, 'http://localhost');\n for (const [, value] of url.searchParams) {\n inputs.push(value);\n }\n }\n\n return inputs;\n }\n\n private flattenObject(obj: any, prefix: string = ''): string[] {\n const result: string[] = [];\n\n if (obj === null || obj === undefined) {\n return result;\n }\n\n if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean') {\n result.push(String(obj));\n return result;\n }\n\n if (Array.isArray(obj)) {\n for (const item of obj) {\n result.push(...this.flattenObject(item));\n }\n return result;\n }\n\n if (typeof obj === 'object') {\n for (const [key, value] of Object.entries(obj)) {\n result.push(...this.flattenObject(value, `${prefix}.${key}`));\n }\n }\n\n return result;\n }\n\n private hasSuspiciousPatterns(input: string): boolean {\n const suspicious = [\n /\\/\\*.*\\*\\//,\n /;\\s*(drop|insert|update|delete|create|alter)/i,\n /@@\\w+/,\n /0x[0-9a-fA-F]{8,}/,\n /waitfor\\s+delay/i,\n /benchmark\\s*\\(/i,\n /sleep\\s*\\(/i,\n ];\n\n return suspicious.some(pattern => pattern.test(input));\n }\n\n middleware() {\n return (req: any, res: any, next: any) => {\n const data: RequestData = {\n ip: req.ip || req.connection?.remoteAddress,\n method: req.method,\n url: req.url,\n headers: req.headers,\n body: req.body,\n userAgent: req.headers?.['user-agent'],\n };\n\n const result = this.check(data);\n\n if (!result.allowed) {\n if (this.config.blockOnDetect) {\n return res.status(403).json({\n error: 'Forbidden',\n message: result.reason,\n });\n } else {\n this.logger.warn('SQL Injection detected (log only)', { reason: result.reason });\n }\n }\n\n next();\n };\n }\n\n addPattern(pattern: string): void {\n this.customPatterns.push(new RegExp(pattern, 'i'));\n }\n\n getConfig(): Required<SQLInjectionConfig> {\n return this.config;\n }\n}\n\nexport default SQLInjectionProtection;\nexport { SQLInjectionProtection };\n","import { BotProtectionConfig } from '../core/Config.js';\nimport Logger from '../core/Logger.js';\nimport type { RequestData } from '../core/Shield.js';\nimport crypto from 'crypto';\n\nclass BotProtection {\n private config: Required<BotProtectionConfig>;\n private logger: Logger;\n private challengeCache: Map<string, { solved: boolean; expires: number }> = new Map();\n private cleanupInterval: NodeJS.Timeout | null = null;\n\n private knownBotPatterns = [\n /bot/i,\n /crawler/i,\n /spider/i,\n /scraper/i,\n /curl/i,\n /wget/i,\n /python-requests/i,\n /node-fetch/i,\n /go-http/i,\n /java\\//i,\n /httpclient/i,\n /fetch/i,\n ];\n\n constructor(config: Partial<BotProtectionConfig>, logger: Logger) {\n this.config = config as Required<BotProtectionConfig>;\n this.logger = logger;\n this.startCleanup();\n }\n\n private startCleanup(): void {\n this.cleanupInterval = setInterval(() => {\n const now = Date.now();\n for (const [key, value] of this.challengeCache.entries()) {\n if (now > value.expires) {\n this.challengeCache.delete(key);\n }\n }\n }, 60000);\n }\n\n private isKnownBot(userAgent: string): boolean {\n for (const pattern of this.knownBotPatterns) {\n if (pattern.test(userAgent)) {\n return true;\n }\n }\n\n if (this.config.blockUserAgents && this.config.blockUserAgents.length > 0) {\n for (const pattern of this.config.blockUserAgents) {\n if (new RegExp(pattern, 'i').test(userAgent)) {\n return true;\n }\n }\n }\n\n if (this.config.allowUserAgents && this.config.allowUserAgents.length > 0) {\n for (const pattern of this.config.allowUserAgents) {\n if (new RegExp(pattern, 'i').test(userAgent)) {\n return false;\n }\n }\n }\n\n return false;\n }\n\n private generateChallenge(): { question: string; answer: string } {\n const a = Math.floor(Math.random() * 10) + 1;\n const b = Math.floor(Math.random() * 10) + 1;\n const answer = (a + b).toString();\n const question = `${a} + ${b} = ?`;\n\n return { question, answer };\n }\n\n async check(data: RequestData): Promise<{ allowed: boolean; reason?: string; challenge?: any }> {\n const userAgent = data.userAgent || '';\n const ip = data.ip || 'unknown';\n\n if (this.isKnownBot(userAgent)) {\n if (this.config.challengeEnabled) {\n const cacheKey = `${ip}:${data.url}`;\n const challengeData = this.challengeCache.get(cacheKey);\n\n if (!challengeData || !challengeData.solved) {\n const challenge = this.generateChallenge();\n this.challengeCache.set(cacheKey, {\n solved: false,\n expires: Date.now() + this.config.challengeExpiryMs,\n });\n\n this.logger.info('Bot challenge issued', { ip, userAgent });\n\n return {\n allowed: false,\n reason: 'Bot verification required',\n challenge: {\n question: challenge.question,\n cookieName: this.config.challengeCookieName,\n },\n };\n }\n } else {\n return {\n allowed: false,\n reason: 'Bot detected and blocked',\n };\n }\n }\n\n return { allowed: true };\n }\n\n verifyChallenge(ip: string, url: string, answer: string): boolean {\n const cacheKey = `${ip}:${url}`;\n const challengeData = this.challengeCache.get(cacheKey);\n\n if (!challengeData) {\n return false;\n }\n\n const storedChallenge = this.challengeCache.get(cacheKey + ':answer');\n if (!storedChallenge) {\n const newChallenge = this.generateChallenge();\n this.challengeCache.set(cacheKey + ':answer', {\n solved: false,\n expires: Date.now() + 60000,\n });\n return newChallenge.answer === answer;\n }\n\n return storedChallenge.solved;\n }\n\n solveChallenge(ip: string, url: string): void {\n const cacheKey = `${ip}:${url}`;\n const data = this.challengeCache.get(cacheKey);\n if (data) {\n data.solved = true;\n this.challengeCache.set(cacheKey, data);\n }\n }\n\n middleware() {\n return async (req: any, res: any, next: any) => {\n const ip = req.ip || req.connection?.remoteAddress || 'unknown';\n const userAgent = req.headers?.['user-agent'] || '';\n \n const data: RequestData = {\n ip,\n method: req.method,\n url: req.url,\n headers: req.headers,\n userAgent,\n };\n\n const challengeCookie = req.cookies?.[this.config.challengeCookieName || 'webarmor_challenge'];\n\n if (challengeCookie) {\n try {\n const decoded = Buffer.from(challengeCookie, 'base64').toString();\n const [storedIp, timestamp] = decoded.split(':');\n \n if (storedIp === ip && Date.now() - parseInt(timestamp) < this.config.challengeExpiryMs) {\n return next();\n }\n } catch (e) {\n // Invalid cookie\n }\n }\n\n const result = await this.check(data);\n\n if (!result.allowed) {\n if (result.challenge) {\n res.setHeader('X-WebArmor-Challenge', 'required');\n \n return res.status(403).json({\n error: 'Bot Verification Required',\n message: result.reason,\n challenge: result.challenge,\n });\n }\n\n return res.status(403).json({\n error: 'Forbidden',\n message: result.reason,\n });\n }\n\n next();\n };\n }\n\n getConfig(): Required<BotProtectionConfig> {\n return this.config;\n }\n\n destroy(): void {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval);\n }\n this.challengeCache.clear();\n }\n}\n\nexport default BotProtection;\nexport { BotProtection };\n","import { IPFilterConfig } from '../core/Config.js';\nimport Logger from '../core/Logger.js';\n\nclass IPFilter {\n private config: Required<IPFilterConfig>;\n private logger: Logger;\n private customBlockedIPs: Set<string> = new Set();\n\n constructor(config: Partial<IPFilterConfig>, logger: Logger) {\n this.config = config as Required<IPFilterConfig>;\n this.logger = logger;\n }\n\n private parseIP(ip: string): { ip: string; isIPv6: boolean; isSubnet: boolean } {\n if (ip.includes('/')) {\n return { ip, isIPv6: ip.includes(':'), isSubnet: true };\n }\n return { ip, isIPv6: ip.includes(':'), isSubnet: false };\n }\n\n private isIPInRange(ip: string, range: string): boolean {\n if (!range.includes('/')) {\n return ip === range;\n }\n\n const [subnet, mask] = range.split('/');\n let maskNum = parseInt(mask);\n\n if (maskNum >= 32) {\n return ip === subnet;\n }\n\n const ipParts = ip.split('.').map(Number);\n const subnetParts = subnet.split('.').map(Number);\n const maskParts: number[] = [];\n\n for (let i = 0; i < 4; i++) {\n if (maskNum >= 8) {\n maskParts.push(255);\n maskNum -= 8;\n } else if (maskNum > 0) {\n maskParts.push(256 - Math.pow(2, 8 - maskNum));\n maskNum = 0;\n } else {\n maskParts.push(0);\n }\n }\n\n for (let i = 0; i < 4; i++) {\n if ((ipParts[i] & maskParts[i]) !== (subnetParts[i] & maskParts[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n private getClientIP(req: any): string {\n if (this.config.useXForwardedFor) {\n const forwarded = req.headers?.['x-forwarded-for'];\n if (forwarded) {\n return forwarded.split(',')[0].trim();\n }\n }\n \n return req.ip || \n req.connection?.remoteAddress || \n req.socket?.remoteAddress || \n '127.0.0.1';\n }\n\n async check(ip: string): Promise<{ allowed: boolean; reason?: string }> {\n const clientIP = this.parseIP(ip);\n\n if (this.config.whitelist.length > 0) {\n const isWhitelisted = this.config.whitelist.some(range => \n this.isIPInRange(ip, range)\n );\n\n if (!isWhitelisted) {\n if (this.config.logBlocked) {\n this.logger.warn('IP not in whitelist, blocked', { ip });\n }\n return {\n allowed: false,\n reason: 'IP not in whitelist',\n };\n }\n\n return { allowed: true };\n }\n\n const isBlocked = this.config.blacklist.some(range => \n this.isIPInRange(ip, range)\n );\n\n if (isBlocked || this.customBlockedIPs.has(ip)) {\n if (this.config.logBlocked) {\n this.logger.warn('IP blocked by blacklist', { ip });\n }\n return {\n allowed: false,\n reason: 'IP is blocked',\n };\n }\n\n return { allowed: true };\n }\n\n addToWhitelist(ip: string): void {\n if (!this.config.whitelist.includes(ip)) {\n this.config.whitelist.push(ip);\n this.logger.info(`Added to whitelist: ${ip}`);\n }\n }\n\n addToBlacklist(ip: string): void {\n this.customBlockedIPs.add(ip);\n this.logger.info(`Added to blacklist: ${ip}`);\n }\n\n removeFromWhitelist(ip: string): void {\n const index = this.config.whitelist.indexOf(ip);\n if (index > -1) {\n this.config.whitelist.splice(index, 1);\n this.logger.info(`Removed from whitelist: ${ip}`);\n }\n }\n\n removeFromBlacklist(ip: string): void {\n this.customBlockedIPs.delete(ip);\n this.logger.info(`Removed from blacklist: ${ip}`);\n }\n\n clearCustomBlacklist(): void {\n this.customBlockedIPs.clear();\n this.logger.info('Custom blacklist cleared');\n }\n\n middleware() {\n return async (req: any, res: any, next: any) => {\n const ip = this.getClientIP(req);\n \n const result = await this.check(ip);\n\n if (!result.allowed) {\n return res.status(403).json({\n error: 'Forbidden',\n message: result.reason,\n });\n }\n\n next();\n };\n }\n\n getConfig(): Required<IPFilterConfig> {\n return this.config;\n }\n}\n\nexport default IPFilter;\nexport { IPFilter };\n","import { FileBlockConfig } from '../core/Config.js';\nimport Logger from '../core/Logger.js';\n\nclass FileBlocker {\n private config: Required<FileBlockConfig>;\n private logger: Logger;\n\n constructor(config: Partial<FileBlockConfig>, logger: Logger) {\n this.config = config as Required<FileBlockConfig>;\n this.logger = logger;\n }\n\n private isPathBlocked(path: string): boolean {\n const normalizedPath = path.toLowerCase();\n\n for (const blocked of this.config.blockedPaths) {\n if (normalizedPath.includes(blocked.toLowerCase())) {\n return true;\n }\n }\n\n const sensitivePatterns = [\n /\\.env$/i,\n /\\.git\\//i,\n /\\.gitignore$/i,\n /config\\.json$/i,\n /\\.npmrc$/i,\n /\\.aws\\//i,\n /\\.ssh\\//i,\n /credentials\\.json$/i,\n /\\.pem$/i,\n /\\.key$/i,\n /\\.p12$/i,\n ];\n\n for (const pattern of sensitivePatterns) {\n if (pattern.test(normalizedPath)) {\n return true;\n }\n }\n\n for (const sensitive of this.config.protectSensitive) {\n if (normalizedPath.includes(sensitive.toLowerCase())) {\n return true;\n }\n }\n\n const ext = normalizedPath.split('.').pop();\n if (ext && this.config.blockedExtensions.includes(`.${ext}`)) {\n return true;\n }\n\n if (this.config.customRules && this.config.customRules.length > 0) {\n for (const rule of this.config.customRules) {\n const regex = new RegExp(rule.pattern, 'i');\n if (regex.test(normalizedPath)) {\n return rule.action === 'block';\n }\n }\n }\n\n return false;\n }\n\n check(path: string): { allowed: boolean; reason?: string } {\n if (this.isPathBlocked(path)) {\n this.logger.warn('File access blocked', { path });\n return {\n allowed: false,\n reason: 'Access to this path is denied',\n };\n }\n\n return { allowed: true };\n }\n\n middleware() {\n return (req: any, res: any, next: any) => {\n const path = req.path || req.url;\n\n const result = this.check(path);\n\n if (!result.allowed) {\n return res.status(403).json({\n error: 'Forbidden',\n message: result.reason,\n });\n }\n\n next();\n };\n }\n\n addBlockedPath(path: string): void {\n if (!this.config.blockedPaths.includes(path)) {\n this.config.blockedPaths.push(path);\n this.logger.info(`Added blocked path: ${path}`);\n }\n }\n\n removeBlockedPath(path: string): void {\n const index = this.config.blockedPaths.indexOf(path);\n if (index > -1) {\n this.config.blockedPaths.splice(index, 1);\n this.logger.info(`Removed blocked path: ${path}`);\n }\n }\n\n addBlockedExtension(ext: string): void {\n const formatted = ext.startsWith('.') ? ext : `.${ext}`;\n if (!this.config.blockedExtensions.includes(formatted)) {\n this.config.blockedExtensions.push(formatted);\n this.logger.info(`Added blocked extension: ${formatted}`);\n }\n }\n\n removeBlockedExtension(ext: string): void {\n const formatted = ext.startsWith('.') ? ext : `.${ext}`;\n const index = this.config.blockedExtensions.indexOf(formatted);\n if (index > -1) {\n this.config.blockedExtensions.splice(index, 1);\n this.logger.info(`Removed blocked extension: ${formatted}`);\n }\n }\n\n addCustomRule(pattern: string, action: 'block' | 'allow'): void {\n this.config.customRules?.push({ pattern, action });\n this.logger.info(`Added custom rule: ${pattern} -> ${action}`);\n }\n\n getConfig(): Required<FileBlockConfig> {\n return this.config;\n }\n}\n\nexport default FileBlocker;\nexport { FileBlocker };\n","import Shield, { WebArmorConfig, Framework } from './core/Shield.js';\nimport FileEncryptor from './encryption/FileEncryptor.js';\nimport ConfigEncryptor from './encryption/ConfigEncryptor.js';\nimport DatabaseEncryptor from './encryption/DatabaseEncryptor.js';\nimport SessionEncryptor from './encryption/SessionEncryptor.js';\nimport Logger from './core/Logger.js';\n\nexport type { WebArmorConfig, Framework };\n\nexport {\n Shield,\n FileEncryptor,\n ConfigEncryptor,\n DatabaseEncryptor,\n SessionEncryptor,\n Logger,\n};\n\nexport type ShieldInstance = InstanceType<typeof Shield>;\n\nexport interface WebArmorOptions {\n config?: WebArmorConfig;\n shield?: Shield;\n}\n\nasync function createWebArmor(config: WebArmorConfig): Promise<ShieldInstance> {\n const shield = new Shield(config);\n await shield.initialize();\n return shield;\n}\n\nexport default {\n create: createWebArmor,\n Shield,\n FileEncryptor,\n ConfigEncryptor,\n DatabaseEncryptor,\n SessionEncryptor,\n Logger,\n};\n\nexport const security = {\n encrypt: (data: string, password: string): string => {\n const enc = new FileEncryptor();\n return enc.encryptString(data, password);\n },\n decrypt: (encryptedData: string, password: string): string => {\n const enc = new FileEncryptor();\n return enc.decryptString(encryptedData, password);\n },\n encryptFile: async (inputPath: string, outputPath: string, password: string): Promise<void> => {\n const enc = new FileEncryptor();\n await enc.encryptFile(inputPath, outputPath, password);\n },\n decryptFile: async (inputPath: string, outputPath: string, password: string): Promise<void> => {\n const enc = new FileEncryptor();\n await enc.decryptFile(inputPath, outputPath, password);\n },\n};\n\nexport const createShield = createWebArmor;\n","export type Framework = 'express' | 'fastify' | 'koa' | 'generic';\n\nexport interface DDoSConfig {\n enabled: boolean;\n maxRequests: number;\n windowMs: number;\n blockDurationMs: number;\n scoreThreshold: number;\n}\n\nexport interface RateLimitConfig {\n enabled: boolean;\n windowMs: number;\n max: number;\n message?: string;\n statusCode?: number;\n skipSuccessfulRequests?: boolean;\n keyGenerator?: (req: any) => string;\n}\n\nexport interface SecurityHeadersConfig {\n enabled: boolean;\n contentSecurityPolicy?: {\n defaultSrc?: string[];\n scriptSrc?: string[];\n styleSrc?: string[];\n imgSrc?: string[];\n connectSrc?: string[];\n fontSrc?: string[];\n objectSrc?: string[];\n mediaSrc?: string[];\n frameSrc?: string[];\n };\n hsts?: {\n enabled: boolean;\n maxAge?: number;\n includeSubDomains?: boolean;\n preload?: boolean;\n };\n xFrameOptions?: 'DENY' | 'SAMEORIGIN' | string;\n xContentTypeOptions?: 'nosniff';\n xssProtection?: string;\n referrerPolicy?: string;\n permissionsPolicy?: Record<string, string[]>;\n}\n\nexport interface CORSConfig {\n enabled: boolean;\n origins: string[];\n methods?: string[];\n allowedHeaders?: string[];\n exposedHeaders?: string[];\n credentials?: boolean;\n maxAge?: number;\n preflightContinue?: boolean;\n}\n\nexport interface XSSConfig {\n enabled: boolean;\n level: 'low' | 'medium' | 'strict';\n blockOnDetect: boolean;\n customRules?: Record<string, string>;\n}\n\nexport interface CSRFConfig {\n enabled: boolean;\n cookie?: {\n name?: string;\n httpOnly?: boolean;\n secure?: boolean;\n sameSite?: 'strict' | 'lax' | 'none';\n };\n tokenLength?: number;\n}\n\nexport interface SQLInjectionConfig {\n enabled: boolean;\n blockOnDetect: boolean;\n logOnly: boolean;\n customPatterns?: string[];\n}\n\nexport interface BotProtectionConfig {\n enabled: boolean;\n challengeEnabled: boolean;\n challengeExpiryMs: number;\n challengeCookieName?: string;\n allowUserAgents?: string[];\n blockUserAgents?: string[];\n}\n\nexport interface IPFilterConfig {\n enabled: boolean;\n whitelist: string[];\n blacklist: string[];\n logBlocked: boolean;\n useXForwardedFor: boolean;\n}\n\nexport interface FileBlockConfig {\n enabled: boolean;\n blockedPaths: string[];\n blockedExtensions: string[];\n protectSensitive: string[];\n customRules?: Array<{\n pattern: string;\n action: 'block' | 'allow';\n }>;\n}\n\nexport interface EncryptionConfig {\n enabled: boolean;\n algorithm: 'aes-256-gcm' | 'aes-256-cbc';\n defaultKey?: string;\n encryptEnv?: boolean;\n encryptDatabase?: boolean;\n encryptConfig?: boolean;\n keyEnvVariable?: string;\n}\n\nexport interface WebArmorConfig {\n framework: Framework;\n debug?: boolean;\n logLevel?: 'error' | 'warn' | 'info' | 'debug';\n ddos?: Partial<DDoSConfig>;\n rateLimit?: Partial<RateLimitConfig>;\n securityHeaders?: Partial<SecurityHeadersConfig> | boolean;\n cors?: Partial<CORSConfig>;\n xss?: Partial<XSSConfig>;\n csrf?: Partial<CSRFConfig>;\n sqlInjection?: Partial<SQLInjectionConfig>;\n botProtection?: Partial<BotProtectionConfig>;\n ipFilter?: Partial<IPFilterConfig>;\n fileBlock?: Partial<FileBlockConfig>;\n encryption?: Partial<EncryptionConfig>;\n}\n\nexport const defaultConfig: Required<WebArmorConfig> = {\n framework: 'express',\n debug: false,\n logLevel: 'info',\n ddos: {\n enabled: true,\n maxRequests: 1000,\n windowMs: 60000,\n blockDurationMs: 300000,\n scoreThreshold: 50,\n },\n rateLimit: {\n enabled: true,\n windowMs: 60000,\n max: 100,\n message: 'Too many requests from this IP, please try again later.',\n statusCode: 429,\n skipSuccessfulRequests: false,\n keyGenerator: undefined,\n },\n securityHeaders: {\n enabled: true,\n contentSecurityPolicy: {\n defaultSrc: [\"'self'\"],\n scriptSrc: [\"'self'\"],\n styleSrc: [\"'self'\"],\n imgSrc: [\"'self'\", 'data:'],\n },\n hsts: {\n enabled: true,\n maxAge: 31536000,\n includeSubDomains: true,\n preload: true,\n },\n xFrameOptions: 'DENY',\n xContentTypeOptions: 'nosniff',\n xssProtection: '1; mode=block',\n referrerPolicy: 'strict-origin-when-cross-origin',\n permissionsPolicy: {},\n },\n cors: {\n enabled: true,\n origins: ['*'],\n methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'],\n allowedHeaders: ['Content-Type', 'Authorization'],\n exposedHeaders: [],\n credentials: false,\n maxAge: 86400,\n preflightContinue: false,\n },\n xss: {\n enabled: true,\n level: 'medium',\n blockOnDetect: true,\n customRules: {},\n },\n csrf: {\n enabled: false,\n cookie: {\n name: '_csrf',\n httpOnly: true,\n secure: true,\n sameSite: 'strict',\n },\n tokenLength: 32,\n },\n sqlInjection: {\n enabled: true,\n blockOnDetect: true,\n logOnly: false,\n customPatterns: [],\n },\n botProtection: {\n enabled: true,\n challengeEnabled: true,\n challengeExpiryMs: 3600000,\n challengeCookieName: 'webarmor_challenge',\n allowUserAgents: [],\n blockUserAgents: [],\n },\n ipFilter: {\n enabled: false,\n whitelist: [],\n blacklist: [],\n logBlocked: true,\n useXForwardedFor: true,\n },\n fileBlock: {\n enabled: true,\n blockedPaths: [],\n blockedExtensions: ['.exe', '.bat', '.cmd', '.sh', '.ps1'],\n protectSensitive: ['.env', '.git', 'config.json', '.npmrc', '.aws/credentials'],\n customRules: [],\n },\n encryption: {\n enabled: false,\n algorithm: 'aes-256-gcm',\n defaultKey: '',\n encryptEnv: false,\n encryptDatabase: false,\n encryptConfig: false,\n keyEnvVariable: 'WEBARMOR_KEY',\n },\n};\n","type LogLevel = 'error' | 'warn' | 'info' | 'debug';\n\ninterface LogEntry {\n level: LogLevel;\n message: string;\n timestamp: Date;\n data?: any;\n}\n\nclass Logger {\n private level: LogLevel;\n private logs: LogEntry[] = [];\n private maxLogs: number = 1000;\n private debugMode: boolean = false;\n\n private levels: Record<LogLevel, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n };\n\n constructor(options?: { level?: LogLevel; debug?: boolean }) {\n this.level = options?.level || 'info';\n this.debugMode = options?.debug || false;\n }\n\n private shouldLog(level: LogLevel): boolean {\n return this.levels[level] <= this.levels[this.level];\n }\n\n private formatMessage(level: LogLevel, message: string, data?: any): string {\n const timestamp = new Date().toISOString();\n let formatted = `[${timestamp}] [${level.toUpperCase()}] ${message}`;\n if (data && this.debugMode) {\n formatted += ` ${JSON.stringify(data)}`;\n }\n return formatted;\n }\n\n error(message: string, data?: any): void {\n if (this.shouldLog('error')) {\n console.error(this.formatMessage('error', message, data));\n this.addLog('error', message, data);\n }\n }\n\n warn(message: string, data?: any): void {\n if (this.shouldLog('warn')) {\n console.warn(this.formatMessage('warn', message, data));\n this.addLog('warn', message, data);\n }\n }\n\n info(message: string, data?: any): void {\n if (this.shouldLog('info')) {\n console.log(this.formatMessage('info', message, data));\n this.addLog('info', message, data);\n }\n }\n\n debug(message: string, data?: any): void {\n if (this.shouldLog('debug')) {\n console.log(this.formatMessage('debug', message, data));\n this.addLog('debug', message, data);\n }\n }\n\n private addLog(level: LogLevel, message: string, data?: any): void {\n this.logs.push({\n level,\n message,\n timestamp: new Date(),\n data,\n });\n\n if (this.logs.length > this.maxLogs) {\n this.logs.shift();\n }\n }\n\n getLogs(level?: LogLevel): LogEntry[] {\n if (level) {\n return this.logs.filter(log => log.level === level);\n }\n return [...this.logs];\n }\n\n clearLogs(): void {\n this.logs = [];\n }\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n setDebug(debug: boolean): void {\n this.debugMode = debug;\n }\n}\n\nexport const logger = new Logger();\n\nexport default Logger;\n","import { WebArmorConfig, defaultConfig, Framework } from './Config.js';\nimport Logger from './Logger.js';\n\nexport type { WebArmorConfig, Framework };\n\nexport interface RequestData {\n ip: string;\n method: string;\n url: string;\n headers: any;\n body?: any;\n userAgent?: string;\n}\n\nexport interface ResponseData {\n statusCode: number;\n headers: any;\n}\n\nexport interface ShieldInstance {\n framework: Framework;\n config: Required<WebArmorConfig>;\n logger: Logger;\n apply: (app: any) => void;\n protect: (data: RequestData) => Promise<{ allowed: boolean; reason?: string }>;\n getStats: () => any;\n updateConfig: (config: Partial<WebArmorConfig>) => void;\n enableModule: (module: string) => void;\n disableModule: (module: string) => void;\n}\n\nclass Shield {\n private config: Required<WebArmorConfig>;\n private logger: Logger;\n private stats: any = {\n requests: 0,\n blocked: 0,\n allowed: 0,\n ddosBlocked: 0,\n rateLimited: 0,\n xssBlocked: 0,\n sqlInjectionBlocked: 0,\n botBlocked: 0,\n ipBlocked: 0,\n fileBlocked: 0,\n startTime: Date.now(),\n };\n private modules: Map<string, any> = new Map();\n private enabledModules: Set<string> = new Set();\n\n constructor(userConfig: WebArmorConfig) {\n this.config = { ...defaultConfig, ...userConfig } as Required<WebArmorConfig>;\n this.logger = new Logger({\n level: this.config.logLevel,\n debug: this.config.debug,\n });\n }\n\n async initialize(): Promise<void> {\n this.logger.info('WebArmor initializing...', { framework: this.config.framework });\n\n await this.initializeModules();\n\n this.logger.info('WebArmor initialized successfully');\n }\n\n private async initializeModules(): Promise<void> {\n if (this.config.ddos.enabled) {\n try {\n const { DDoSProtection } = await import('../modules/ddos/DDoSProtection.js');\n const ddos = new DDoSProtection(this.config.ddos, this.logger);\n this.modules.set('ddos', ddos);\n this.enabledModules.add('ddos');\n } catch (e) {\n this.logger.error('Failed to initialize DDoS protection', e);\n }\n }\n\n if (this.config.rateLimit.enabled) {\n try {\n const { RateLimiter } = await import('../modules/ratelimit/RateLimiter.js');\n const rateLimit = new RateLimiter(this.config.rateLimit, this.logger);\n this.modules.set('rateLimit', rateLimit);\n this.enabledModules.add('rateLimit');\n } catch (e) {\n this.logger.error('Failed to initialize Rate Limiter', e);\n }\n }\n\n if (this.config.securityHeaders && typeof this.config.securityHeaders !== 'boolean' && this.config.securityHeaders.enabled) {\n try {\n const { SecurityHeaders } = await import('../modules/security-headers/SecurityHeaders.js');\n const headers = new SecurityHeaders(this.config.securityHeaders, this.logger);\n this.modules.set('securityHeaders', headers);\n this.enabledModules.add('securityHeaders');\n } catch (e) {\n this.logger.error('Failed to initialize Security Headers', e);\n }\n }\n\n if (this.config.cors.enabled) {\n try {\n const { CORSManager } = await import('../modules/cors/CORSManager.js');\n const cors = new CORSManager(this.config.cors, this.logger);\n this.modules.set('cors', cors);\n this.enabledModules.add('cors');\n } catch (e) {\n this.logger.error('Failed to initialize CORS', e);\n }\n }\n\n if (this.config.xss.enabled) {\n try {\n const { XSSProtection } = await import('../modules/xss/XSSProtection.js');\n const xss = new XSSProtection(this.config.xss, this.logger);\n this.modules.set('xss', xss);\n this.enabledModules.add('xss');\n } catch (e) {\n this.logger.error('Failed to initialize XSS Protection', e);\n }\n }\n\n if (this.config.csrf.enabled) {\n try {\n const { CSRFProtection } = await import('../modules/csrf/CSRFProtection.js');\n const csrf = new CSRFProtection(this.config.csrf, this.logger);\n this.modules.set('csrf', csrf);\n this.enabledModules.add('csrf');\n } catch (e) {\n this.logger.error('Failed to initialize CSRF Protection', e);\n }\n }\n\n if (this.config.sqlInjection.enabled) {\n try {\n const { SQLInjectionProtection } = await import('../modules/sql-injection/SQLInjectionProtection.js');\n const sql = new SQLInjectionProtection(this.config.sqlInjection, this.logger);\n this.modules.set('sqlInjection', sql);\n this.enabledModules.add('sqlInjection');\n } catch (e) {\n this.logger.error('Failed to initialize SQL Injection Protection', e);\n }\n }\n\n if (this.config.botProtection.enabled) {\n try {\n const { BotProtection } = await import('../modules/bot-protection/BotProtection.js');\n const bot = new BotProtection(this.config.botProtection, this.logger);\n this.modules.set('botProtection', bot);\n this.enabledModules.add('botProtection');\n } catch (e) {\n this.logger.error('Failed to initialize Bot Protection', e);\n }\n }\n\n if (this.config.ipFilter.enabled) {\n try {\n const { IPFilter } = await import('../modules/ip-filter/IPFilter.js');\n const ipFilter = new IPFilter(this.config.ipFilter, this.logger);\n this.modules.set('ipFilter', ipFilter);\n this.enabledModules.add('ipFilter');\n } catch (e) {\n this.logger.error('Failed to initialize IP Filter', e);\n }\n }\n\n if (this.config.fileBlock.enabled) {\n try {\n const { FileBlocker } = await import('../modules/file-block/FileBlocker.js');\n const fileBlock = new FileBlocker(this.config.fileBlock, this.logger);\n this.modules.set('fileBlock', fileBlock);\n this.enabledModules.add('fileBlock');\n } catch (e) {\n this.logger.error('Failed to initialize File Blocker', e);\n }\n }\n }\n\n apply(app: any): void {\n this.logger.info('Applying WebArmor middleware to app');\n\n if (app && typeof app.use === 'function') {\n if (this.modules.has('securityHeaders')) {\n const headers = this.modules.get('securityHeaders');\n app.use(headers.middleware());\n }\n\n if (this.modules.has('cors')) {\n const cors = this.modules.get('cors');\n app.use(cors.middleware());\n }\n\n if (this.modules.has('rateLimit')) {\n const rateLimit = this.modules.get('rateLimit');\n app.use(rateLimit.middleware());\n }\n\n if (this.modules.has('xss')) {\n const xss = this.modules.get('xss');\n app.use(xss.middleware());\n }\n\n if (this.modules.has('sqlInjection')) {\n const sql = this.modules.get('sqlInjection');\n app.use(sql.middleware());\n }\n\n if (this.modules.has('botProtection')) {\n const bot = this.modules.get('botProtection');\n app.use(bot.middleware());\n }\n\n if (this.modules.has('ipFilter')) {\n const ipFilter = this.modules.get('ipFilter');\n app.use(ipFilter.middleware());\n }\n\n if (this.modules.has('fileBlock')) {\n const fileBlock = this.modules.get('fileBlock');\n app.use(fileBlock.middleware());\n }\n }\n\n this.logger.info('WebArmor middleware applied');\n }\n\n async protect(data: RequestData): Promise<{ allowed: boolean; reason?: string }> {\n this.stats.requests++;\n\n if (this.modules.has('ipFilter')) {\n const ipFilter = this.modules.get('ipFilter');\n const result = await ipFilter.check(data.ip);\n if (!result.allowed) {\n this.stats.ipBlocked++;\n this.stats.blocked++;\n return result;\n }\n }\n\n if (this.modules.has('ddos')) {\n const ddos = this.modules.get('ddos');\n const result = await ddos.check(data);\n if (!result.allowed) {\n this.stats.ddosBlocked++;\n this.stats.blocked++;\n return result;\n }\n }\n\n if (this.modules.has('rateLimit')) {\n const rateLimit = this.modules.get('rateLimit');\n const key = data.ip;\n const result = await rateLimit.check(key);\n if (!result.allowed) {\n this.stats.rateLimited++;\n this.stats.blocked++;\n return result;\n }\n }\n\n if (this.modules.has('botProtection')) {\n const bot = this.modules.get('botProtection');\n const result = await bot.check(data);\n if (!result.allowed) {\n this.stats.botBlocked++;\n this.stats.blocked++;\n return result;\n }\n }\n\n if (this.modules.has('xss') && data.body) {\n const xss = this.modules.get('xss');\n const result = xss.check(data.body);\n if (!result.allowed) {\n this.stats.xssBlocked++;\n if (this.config.xss.blockOnDetect) {\n this.stats.blocked++;\n return result;\n }\n }\n }\n\n if (this.modules.has('sqlInjection')) {\n const sql = this.modules.get('sqlInjection');\n const result = sql.check(data);\n if (!result.allowed) {\n this.stats.sqlInjectionBlocked++;\n if (this.config.sqlInjection.blockOnDetect) {\n this.stats.blocked++;\n return result;\n }\n }\n }\n\n this.stats.allowed++;\n return { allowed: true };\n }\n\n getStats(): any {\n return {\n ...this.stats,\n uptime: Date.now() - this.stats.startTime,\n enabledModules: Array.from(this.enabledModules),\n };\n }\n\n updateConfig(config: Partial<WebArmorConfig>): void {\n this.config = { ...this.config, ...config };\n this.logger.info('Configuration updated');\n }\n\n enableModule(moduleName: string): void {\n if (this.modules.has(moduleName)) {\n this.enabledModules.add(moduleName);\n this.logger.info(`Module ${moduleName} enabled`);\n }\n }\n\n disableModule(moduleName: string): void {\n if (this.enabledModules.has(moduleName)) {\n this.enabledModules.delete(moduleName);\n this.logger.info(`Module ${moduleName} disabled`);\n }\n }\n\n getLogger(): Logger {\n return this.logger;\n }\n\n getConfig(): Required<WebArmorConfig> {\n return this.config;\n }\n\n getModule(name: string): any {\n return this.modules.get(name);\n }\n}\n\nexport default Shield;\n","import crypto, { CipherGCM, DecipherGCM } from 'crypto';\nimport fs from 'fs';\n\nclass FileEncryptor {\n private algorithm: string = 'aes-256-gcm';\n private keyLength: number = 32;\n private ivLength: number = 16;\n private authTagLength: number = 16;\n\n private deriveKey(password: string, salt: Buffer): Buffer {\n return crypto.pbkdf2Sync(password, salt, 100000, this.keyLength, 'sha256');\n }\n\n encryptFile(inputPath: string, outputPath: string, password: string): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n const salt = crypto.randomBytes(32);\n const key = this.deriveKey(password, salt);\n const iv = crypto.randomBytes(this.ivLength);\n\n const cipher = crypto.createCipheriv(this.algorithm, key, iv) as CipherGCM;\n\n const input = fs.readFileSync(inputPath);\n const encrypted = Buffer.concat([cipher.update(input), cipher.final()]);\n const authTag = cipher.getAuthTag();\n\n const output = Buffer.concat([\n salt,\n iv,\n authTag,\n encrypted,\n ]);\n\n fs.writeFileSync(outputPath, output);\n resolve();\n } catch (error) {\n reject(error);\n }\n });\n }\n\n decryptFile(inputPath: string, outputPath: string, password: string): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n const fileData = fs.readFileSync(inputPath);\n\n const salt = fileData.subarray(0, 32);\n const iv = fileData.subarray(32, 32 + this.ivLength);\n const authTag = fileData.subarray(32 + this.ivLength, 32 + this.ivLength + this.authTagLength);\n const encrypted = fileData.subarray(32 + this.ivLength + this.authTagLength);\n\n const key = this.deriveKey(password, salt);\n\n const decipher = crypto.createDecipheriv(this.algorithm, key, iv) as DecipherGCM;\n decipher.setAuthTag(authTag);\n\n const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]);\n\n fs.writeFileSync(outputPath, decrypted);\n resolve();\n } catch (error) {\n reject(error);\n }\n });\n }\n\n encryptString(data: string, password: string): string {\n const salt = crypto.randomBytes(32);\n const key = this.deriveKey(password, salt);\n const iv = crypto.randomBytes(this.ivLength);\n\n const cipher = crypto.createCipheriv(this.algorithm, key, iv) as CipherGCM;\n const encrypted = Buffer.concat([cipher.update(data, 'utf8'), cipher.final()]);\n const authTag = cipher.getAuthTag();\n\n return Buffer.concat([salt, iv, authTag, encrypted]).toString('base64');\n }\n\n decryptString(encryptedData: string, password: string): string {\n const data = Buffer.from(encryptedData, 'base64');\n\n const salt = data.subarray(0, 32);\n const iv = data.subarray(32, 32 + this.ivLength);\n const authTag = data.subarray(32 + this.ivLength, 32 + this.ivLength + this.authTagLength);\n const encrypted = data.subarray(32 + this.ivLength + this.authTagLength);\n\n const key = this.deriveKey(password, salt);\n\n const decipher = crypto.createDecipheriv(this.algorithm, key, iv) as DecipherGCM;\n decipher.setAuthTag(authTag);\n\n return decipher.update(encrypted) + decipher.final('utf8');\n }\n\n encryptJSON(data: object, password: string): string {\n const jsonString = JSON.stringify(data);\n return this.encryptString(jsonString, password);\n }\n\n decryptJSON<T>(encryptedData: string, password: string): T {\n const decrypted = this.decryptString(encryptedData, password);\n return JSON.parse(decrypted);\n }\n}\n\nexport default FileEncryptor;\nexport { FileEncryptor };\n","import fs from 'fs';\nimport path from 'path';\nimport FileEncryptor from './FileEncryptor.js';\n\nclass ConfigEncryptor {\n private encryptor: FileEncryptor;\n private configDir: string;\n private backupDir: string;\n\n constructor(configDir: string = './config') {\n this.encryptor = new FileEncryptor();\n this.configDir = configDir;\n this.backupDir = path.join(configDir, '.backup');\n }\n\n encryptConfigFile(filename: string, password: string): void {\n const inputPath = path.join(this.configDir, filename);\n const outputPath = path.join(this.configDir, `${filename}.enc`);\n\n if (!fs.existsSync(this.configDir)) {\n fs.mkdirSync(this.configDir, { recursive: true });\n }\n\n this.createBackup(inputPath);\n this.encryptor.encryptFile(inputPath, outputPath, password);\n fs.unlinkSync(inputPath);\n }\n\n decryptConfigFile(filename: string, password: string): void {\n const inputPath = path.join(this.configDir, `${filename}.enc`);\n const outputPath = path.join(this.configDir, filename.replace('.enc', ''));\n\n if (!fs.existsSync(inputPath)) {\n throw new Error(`Encrypted file not found: ${filename}`);\n }\n\n this.encryptor.decryptFile(inputPath, outputPath, password);\n }\n\n encryptEnvFile(password: string): void {\n const envPath = path.join(process.cwd(), '.env');\n const envBackupPath = path.join(process.cwd(), '.env.backup');\n const envEncryptedPath = path.join(process.cwd(), '.env.enc');\n\n if (!fs.existsSync(envPath)) {\n throw new Error('.env file not found');\n }\n\n if (fs.existsSync(envBackupPath)) {\n fs.unlinkSync(envBackupPath);\n }\n fs.copyFileSync(envPath, envBackupPath);\n\n this.encryptor.encryptFile(envPath, envEncryptedPath, password);\n fs.unlinkSync(envPath);\n }\n\n decryptEnvFile(password: string): void {\n const envEncryptedPath = path.join(process.cwd(), '.env.enc');\n const envPath = path.join(process.cwd(), '.env');\n\n if (!fs.existsSync(envEncryptedPath)) {\n throw new Error('.env.enc file not found');\n }\n\n this.encryptor.decryptFile(envEncryptedPath, envPath, password);\n }\n\n getEncryptedEnv(password: string): Record<string, string> {\n const envEncryptedPath = path.join(process.cwd(), '.env.enc');\n\n if (!fs.existsSync(envEncryptedPath)) {\n throw new Error('.env.enc file not found');\n }\n\n const tempOutput = path.join(process.cwd(), '.env.temp');\n this.encryptor.decryptFile(envEncryptedPath, tempOutput, password);\n\n const content = fs.readFileSync(tempOutput, 'utf8');\n fs.unlinkSync(tempOutput);\n\n const envVars: Record<string, string> = {};\n const lines = content.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n const [key, ...valueParts] = trimmed.split('=');\n if (key) {\n envVars[key.trim()] = valueParts.join('=').trim();\n }\n }\n\n return envVars;\n }\n\n private createBackup(filePath: string): void {\n if (!fs.existsSync(filePath)) return;\n\n if (!fs.existsSync(this.backupDir)) {\n fs.mkdirSync(this.backupDir, { recursive: true });\n }\n\n const filename = path.basename(filePath);\n const timestamp = Date.now();\n const backupPath = path.join(this.backupDir, `${filename}.${timestamp}.bak`);\n\n fs.copyFileSync(filePath, backupPath);\n }\n\n restoreBackup(filename: string): void {\n if (!fs.existsSync(this.backupDir)) {\n throw new Error('No backups found');\n }\n\n const backups = fs.readdirSync(this.backupDir)\n .filter(f => f.startsWith(filename))\n .sort()\n .reverse();\n\n if (backups.length === 0) {\n throw new Error(`No backups found for ${filename}`);\n }\n\n const latestBackup = path.join(this.backupDir, backups[0]);\n const originalPath = path.join(this.configDir, filename);\n\n fs.copyFileSync(latestBackup, originalPath);\n }\n\n listBackups(): string[] {\n if (!fs.existsSync(this.backupDir)) {\n return [];\n }\n\n return fs.readdirSync(this.backupDir);\n }\n}\n\nexport default ConfigEncryptor;\nexport { ConfigEncryptor };\n","import fs from 'fs';\nimport path from 'path';\nimport FileEncryptor from './FileEncryptor.js';\n\nclass DatabaseEncryptor {\n private encryptor: FileEncryptor;\n private dbDir: string;\n\n constructor(dbDir: string = './data') {\n this.encryptor = new FileEncryptor();\n this.dbDir = dbDir;\n }\n\n encryptDatabase(dbPath: string, password: string, outputPath?: string): void {\n const targetPath = outputPath || `${dbPath}.enc`;\n \n if (!fs.existsSync(dbPath)) {\n throw new Error(`Database file not found: ${dbPath}`);\n }\n\n this.encryptor.encryptFile(dbPath, targetPath, password);\n }\n\n decryptDatabase(encryptedPath: string, password: string, outputPath?: string): void {\n const targetPath = outputPath || encryptedPath.replace('.enc', '');\n \n if (!fs.existsSync(encryptedPath)) {\n throw new Error(`Encrypted database not found: ${encryptedPath}`);\n }\n\n this.encryptor.decryptFile(encryptedPath, targetPath, password);\n }\n\n encryptJSONDatabase(dbPath: string, password: string): void {\n if (!fs.existsSync(dbPath)) {\n throw new Error(`Database file not found: ${dbPath}`);\n }\n\n const data = JSON.parse(fs.readFileSync(dbPath, 'utf8'));\n const encrypted = this.encryptor.encryptJSON(data, password);\n fs.writeFileSync(dbPath, encrypted, 'utf8');\n }\n\n decryptJSONDatabase<T>(dbPath: string, password: string): T {\n if (!fs.existsSync(dbPath)) {\n throw new Error(`Database file not found: ${dbPath}`);\n }\n\n const encrypted = fs.readFileSync(dbPath, 'utf8');\n return this.encryptor.decryptJSON<T>(encrypted, password);\n }\n\n encryptSQLite(dbPath: string, password: string): void {\n this.encryptDatabase(dbPath, password);\n }\n\n decryptSQLite(encryptedPath: string, password: string): void {\n this.decryptDatabase(encryptedPath, password);\n }\n\n autoEncryptDatabases(password: string, extensions: string[] = ['.json', '.sqlite', '.db']): void {\n if (!fs.existsSync(this.dbDir)) {\n return;\n }\n\n const files = fs.readdirSync(this.dbDir);\n\n for (const file of files) {\n const ext = path.extname(file);\n if (extensions.includes(ext)) {\n const filePath = path.join(this.dbDir, file);\n const encryptedPath = `${filePath}.enc`;\n\n this.encryptor.encryptFile(filePath, encryptedPath, password);\n fs.unlinkSync(filePath);\n }\n }\n }\n\n autoDecryptDatabases(password: string): void {\n if (!fs.existsSync(this.dbDir)) {\n return;\n }\n\n const files = fs.readdirSync(this.dbDir);\n\n for (const file of files) {\n if (file.endsWith('.enc')) {\n const encryptedPath = path.join(this.dbDir, file);\n const decryptedPath = encryptedPath.replace('.enc', '');\n\n this.encryptor.decryptFile(encryptedPath, decryptedPath, password);\n fs.unlinkSync(encryptedPath);\n }\n }\n }\n\n createEncryptedBackup(dbPath: string, backupDir: string, password: string): string {\n if (!fs.existsSync(backupDir)) {\n fs.mkdirSync(backupDir, { recursive: true });\n }\n\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const filename = path.basename(dbPath, path.extname(dbPath));\n const backupPath = path.join(backupDir, `${filename}_${timestamp}.enc`);\n\n this.encryptor.encryptFile(dbPath, backupPath, password);\n return backupPath;\n }\n\n listEncryptedBackups(backupDir: string): string[] {\n if (!fs.existsSync(backupDir)) {\n return [];\n }\n\n return fs.readdirSync(backupDir)\n .filter(f => f.endsWith('.enc'))\n .map(f => path.join(backupDir, f));\n }\n}\n\nexport default DatabaseEncryptor;\nexport { DatabaseEncryptor };\n","import crypto from 'crypto';\nimport FileEncryptor from './FileEncryptor.js';\n\ninterface SessionData {\n [key: string]: any;\n}\n\nclass SessionEncryptor {\n private encryptor: FileEncryptor;\n private key: Buffer | null = null;\n\n constructor(key?: string) {\n this.encryptor = new FileEncryptor();\n if (key) {\n this.setKey(key);\n }\n }\n\n setKey(key: string): void {\n this.key = crypto.createHash('sha256').update(key).digest();\n }\n\n private ensureKey(): void {\n if (!this.key) {\n throw new Error('Encryption key not set. Call setKey() first.');\n }\n }\n\n encryptSession(sessionData: SessionData): string {\n this.ensureKey();\n const json = JSON.stringify(sessionData);\n return this.encryptor.encryptString(json, this.key!.toString('base64'));\n }\n\n decryptSession<T extends SessionData>(encryptedData: string): T {\n this.ensureKey();\n const decrypted = this.encryptor.decryptString(encryptedData, this.key!.toString('base64'));\n return JSON.parse(decrypted) as T;\n }\n\n encryptValue(value: any): string {\n this.ensureKey();\n \n if (typeof value === 'object') {\n return this.encryptor.encryptJSON(value, this.key!.toString('base64'));\n }\n \n return this.encryptor.encryptString(String(value), this.key!.toString('base64'));\n }\n\n decryptValue<T>(encryptedValue: string): T {\n this.ensureKey();\n \n try {\n const decrypted = this.encryptor.decryptString(encryptedValue, this.key!.toString('base64'));\n \n try {\n return JSON.parse(decrypted) as T;\n } catch {\n return decrypted as T;\n }\n } catch {\n try {\n return this.encryptor.decryptJSON<T>(encryptedValue, this.key!.toString('base64'));\n } catch {\n throw new Error('Failed to decrypt value');\n }\n }\n }\n\n createSignedSession(sessionData: SessionData, secret: string): string {\n const encrypted = this.encryptSession(sessionData);\n const signature = crypto\n .createHmac('sha256', secret)\n .update(encrypted)\n .digest('base64');\n\n return `${encrypted}.${signature}`;\n }\n\n verifySignedSession(signedSession: string, secret: string): { valid: boolean; data?: SessionData } {\n const parts = signedSession.split('.');\n \n if (parts.length !== 2) {\n return { valid: false };\n }\n\n const [encrypted, signature] = parts;\n const expectedSignature = crypto\n .createHmac('sha256', secret)\n .update(encrypted)\n .digest('base64');\n\n if (signature !== expectedSignature) {\n return { valid: false };\n }\n\n try {\n const data = this.decryptSession<SessionData>(encrypted);\n return { valid: true, data };\n } catch {\n return { valid: false };\n }\n }\n\n encryptCookie(sessionData: SessionData, password: string): string {\n return this.encryptor.encryptString(JSON.stringify(sessionData), password);\n }\n\n decryptCookie<T>(encryptedCookie: string, password: string): T {\n const decrypted = this.encryptor.decryptString(encryptedCookie, password);\n return JSON.parse(decrypted) as T;\n }\n\n generateSecureToken(length: number = 32): string {\n return crypto.randomBytes(length).toString('hex');\n }\n\n hashData(data: string): string {\n return crypto.createHash('sha256').update(data).digest('hex');\n }\n\n verifyHash(data: string, hash: string): boolean {\n return this.hashData(data) === hash;\n }\n}\n\nexport default SessionEncryptor;\nexport { SessionEncryptor };\n"],"mappings":"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","names":["logger","logger","logger","logger","logger","path","logger","crypto","token","logger","logger","logger","logger","path","DDoSProtection","RateLimiter","SecurityHeaders","CORSManager","XSSProtection","CSRFProtection","SQLInjectionProtection","BotProtection","IPFilter","FileBlocker","import_crypto","crypto","fs","import_fs","path","fs","import_fs","import_path","fs","path","import_crypto","crypto"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
type Framework = 'express' | 'fastify' | 'koa' | 'generic';
|
|
2
|
+
interface DDoSConfig {
|
|
3
|
+
enabled: boolean;
|
|
4
|
+
maxRequests: number;
|
|
5
|
+
windowMs: number;
|
|
6
|
+
blockDurationMs: number;
|
|
7
|
+
scoreThreshold: number;
|
|
8
|
+
}
|
|
9
|
+
interface RateLimitConfig {
|
|
10
|
+
enabled: boolean;
|
|
11
|
+
windowMs: number;
|
|
12
|
+
max: number;
|
|
13
|
+
message?: string;
|
|
14
|
+
statusCode?: number;
|
|
15
|
+
skipSuccessfulRequests?: boolean;
|
|
16
|
+
keyGenerator?: (req: any) => string;
|
|
17
|
+
}
|
|
18
|
+
interface SecurityHeadersConfig {
|
|
19
|
+
enabled: boolean;
|
|
20
|
+
contentSecurityPolicy?: {
|
|
21
|
+
defaultSrc?: string[];
|
|
22
|
+
scriptSrc?: string[];
|
|
23
|
+
styleSrc?: string[];
|
|
24
|
+
imgSrc?: string[];
|
|
25
|
+
connectSrc?: string[];
|
|
26
|
+
fontSrc?: string[];
|
|
27
|
+
objectSrc?: string[];
|
|
28
|
+
mediaSrc?: string[];
|
|
29
|
+
frameSrc?: string[];
|
|
30
|
+
};
|
|
31
|
+
hsts?: {
|
|
32
|
+
enabled: boolean;
|
|
33
|
+
maxAge?: number;
|
|
34
|
+
includeSubDomains?: boolean;
|
|
35
|
+
preload?: boolean;
|
|
36
|
+
};
|
|
37
|
+
xFrameOptions?: 'DENY' | 'SAMEORIGIN' | string;
|
|
38
|
+
xContentTypeOptions?: 'nosniff';
|
|
39
|
+
xssProtection?: string;
|
|
40
|
+
referrerPolicy?: string;
|
|
41
|
+
permissionsPolicy?: Record<string, string[]>;
|
|
42
|
+
}
|
|
43
|
+
interface CORSConfig {
|
|
44
|
+
enabled: boolean;
|
|
45
|
+
origins: string[];
|
|
46
|
+
methods?: string[];
|
|
47
|
+
allowedHeaders?: string[];
|
|
48
|
+
exposedHeaders?: string[];
|
|
49
|
+
credentials?: boolean;
|
|
50
|
+
maxAge?: number;
|
|
51
|
+
preflightContinue?: boolean;
|
|
52
|
+
}
|
|
53
|
+
interface XSSConfig {
|
|
54
|
+
enabled: boolean;
|
|
55
|
+
level: 'low' | 'medium' | 'strict';
|
|
56
|
+
blockOnDetect: boolean;
|
|
57
|
+
customRules?: Record<string, string>;
|
|
58
|
+
}
|
|
59
|
+
interface CSRFConfig {
|
|
60
|
+
enabled: boolean;
|
|
61
|
+
cookie?: {
|
|
62
|
+
name?: string;
|
|
63
|
+
httpOnly?: boolean;
|
|
64
|
+
secure?: boolean;
|
|
65
|
+
sameSite?: 'strict' | 'lax' | 'none';
|
|
66
|
+
};
|
|
67
|
+
tokenLength?: number;
|
|
68
|
+
}
|
|
69
|
+
interface SQLInjectionConfig {
|
|
70
|
+
enabled: boolean;
|
|
71
|
+
blockOnDetect: boolean;
|
|
72
|
+
logOnly: boolean;
|
|
73
|
+
customPatterns?: string[];
|
|
74
|
+
}
|
|
75
|
+
interface BotProtectionConfig {
|
|
76
|
+
enabled: boolean;
|
|
77
|
+
challengeEnabled: boolean;
|
|
78
|
+
challengeExpiryMs: number;
|
|
79
|
+
challengeCookieName?: string;
|
|
80
|
+
allowUserAgents?: string[];
|
|
81
|
+
blockUserAgents?: string[];
|
|
82
|
+
}
|
|
83
|
+
interface IPFilterConfig {
|
|
84
|
+
enabled: boolean;
|
|
85
|
+
whitelist: string[];
|
|
86
|
+
blacklist: string[];
|
|
87
|
+
logBlocked: boolean;
|
|
88
|
+
useXForwardedFor: boolean;
|
|
89
|
+
}
|
|
90
|
+
interface FileBlockConfig {
|
|
91
|
+
enabled: boolean;
|
|
92
|
+
blockedPaths: string[];
|
|
93
|
+
blockedExtensions: string[];
|
|
94
|
+
protectSensitive: string[];
|
|
95
|
+
customRules?: Array<{
|
|
96
|
+
pattern: string;
|
|
97
|
+
action: 'block' | 'allow';
|
|
98
|
+
}>;
|
|
99
|
+
}
|
|
100
|
+
interface EncryptionConfig {
|
|
101
|
+
enabled: boolean;
|
|
102
|
+
algorithm: 'aes-256-gcm' | 'aes-256-cbc';
|
|
103
|
+
defaultKey?: string;
|
|
104
|
+
encryptEnv?: boolean;
|
|
105
|
+
encryptDatabase?: boolean;
|
|
106
|
+
encryptConfig?: boolean;
|
|
107
|
+
keyEnvVariable?: string;
|
|
108
|
+
}
|
|
109
|
+
interface WebArmorConfig {
|
|
110
|
+
framework: Framework;
|
|
111
|
+
debug?: boolean;
|
|
112
|
+
logLevel?: 'error' | 'warn' | 'info' | 'debug';
|
|
113
|
+
ddos?: Partial<DDoSConfig>;
|
|
114
|
+
rateLimit?: Partial<RateLimitConfig>;
|
|
115
|
+
securityHeaders?: Partial<SecurityHeadersConfig> | boolean;
|
|
116
|
+
cors?: Partial<CORSConfig>;
|
|
117
|
+
xss?: Partial<XSSConfig>;
|
|
118
|
+
csrf?: Partial<CSRFConfig>;
|
|
119
|
+
sqlInjection?: Partial<SQLInjectionConfig>;
|
|
120
|
+
botProtection?: Partial<BotProtectionConfig>;
|
|
121
|
+
ipFilter?: Partial<IPFilterConfig>;
|
|
122
|
+
fileBlock?: Partial<FileBlockConfig>;
|
|
123
|
+
encryption?: Partial<EncryptionConfig>;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
type LogLevel = 'error' | 'warn' | 'info' | 'debug';
|
|
127
|
+
interface LogEntry {
|
|
128
|
+
level: LogLevel;
|
|
129
|
+
message: string;
|
|
130
|
+
timestamp: Date;
|
|
131
|
+
data?: any;
|
|
132
|
+
}
|
|
133
|
+
declare class Logger {
|
|
134
|
+
private level;
|
|
135
|
+
private logs;
|
|
136
|
+
private maxLogs;
|
|
137
|
+
private debugMode;
|
|
138
|
+
private levels;
|
|
139
|
+
constructor(options?: {
|
|
140
|
+
level?: LogLevel;
|
|
141
|
+
debug?: boolean;
|
|
142
|
+
});
|
|
143
|
+
private shouldLog;
|
|
144
|
+
private formatMessage;
|
|
145
|
+
error(message: string, data?: any): void;
|
|
146
|
+
warn(message: string, data?: any): void;
|
|
147
|
+
info(message: string, data?: any): void;
|
|
148
|
+
debug(message: string, data?: any): void;
|
|
149
|
+
private addLog;
|
|
150
|
+
getLogs(level?: LogLevel): LogEntry[];
|
|
151
|
+
clearLogs(): void;
|
|
152
|
+
setLevel(level: LogLevel): void;
|
|
153
|
+
setDebug(debug: boolean): void;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
interface RequestData {
|
|
157
|
+
ip: string;
|
|
158
|
+
method: string;
|
|
159
|
+
url: string;
|
|
160
|
+
headers: any;
|
|
161
|
+
body?: any;
|
|
162
|
+
userAgent?: string;
|
|
163
|
+
}
|
|
164
|
+
declare class Shield {
|
|
165
|
+
private config;
|
|
166
|
+
private logger;
|
|
167
|
+
private stats;
|
|
168
|
+
private modules;
|
|
169
|
+
private enabledModules;
|
|
170
|
+
constructor(userConfig: WebArmorConfig);
|
|
171
|
+
initialize(): Promise<void>;
|
|
172
|
+
private initializeModules;
|
|
173
|
+
apply(app: any): void;
|
|
174
|
+
protect(data: RequestData): Promise<{
|
|
175
|
+
allowed: boolean;
|
|
176
|
+
reason?: string;
|
|
177
|
+
}>;
|
|
178
|
+
getStats(): any;
|
|
179
|
+
updateConfig(config: Partial<WebArmorConfig>): void;
|
|
180
|
+
enableModule(moduleName: string): void;
|
|
181
|
+
disableModule(moduleName: string): void;
|
|
182
|
+
getLogger(): Logger;
|
|
183
|
+
getConfig(): Required<WebArmorConfig>;
|
|
184
|
+
getModule(name: string): any;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
declare class FileEncryptor {
|
|
188
|
+
private algorithm;
|
|
189
|
+
private keyLength;
|
|
190
|
+
private ivLength;
|
|
191
|
+
private authTagLength;
|
|
192
|
+
private deriveKey;
|
|
193
|
+
encryptFile(inputPath: string, outputPath: string, password: string): Promise<void>;
|
|
194
|
+
decryptFile(inputPath: string, outputPath: string, password: string): Promise<void>;
|
|
195
|
+
encryptString(data: string, password: string): string;
|
|
196
|
+
decryptString(encryptedData: string, password: string): string;
|
|
197
|
+
encryptJSON(data: object, password: string): string;
|
|
198
|
+
decryptJSON<T>(encryptedData: string, password: string): T;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
declare class ConfigEncryptor {
|
|
202
|
+
private encryptor;
|
|
203
|
+
private configDir;
|
|
204
|
+
private backupDir;
|
|
205
|
+
constructor(configDir?: string);
|
|
206
|
+
encryptConfigFile(filename: string, password: string): void;
|
|
207
|
+
decryptConfigFile(filename: string, password: string): void;
|
|
208
|
+
encryptEnvFile(password: string): void;
|
|
209
|
+
decryptEnvFile(password: string): void;
|
|
210
|
+
getEncryptedEnv(password: string): Record<string, string>;
|
|
211
|
+
private createBackup;
|
|
212
|
+
restoreBackup(filename: string): void;
|
|
213
|
+
listBackups(): string[];
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
declare class DatabaseEncryptor {
|
|
217
|
+
private encryptor;
|
|
218
|
+
private dbDir;
|
|
219
|
+
constructor(dbDir?: string);
|
|
220
|
+
encryptDatabase(dbPath: string, password: string, outputPath?: string): void;
|
|
221
|
+
decryptDatabase(encryptedPath: string, password: string, outputPath?: string): void;
|
|
222
|
+
encryptJSONDatabase(dbPath: string, password: string): void;
|
|
223
|
+
decryptJSONDatabase<T>(dbPath: string, password: string): T;
|
|
224
|
+
encryptSQLite(dbPath: string, password: string): void;
|
|
225
|
+
decryptSQLite(encryptedPath: string, password: string): void;
|
|
226
|
+
autoEncryptDatabases(password: string, extensions?: string[]): void;
|
|
227
|
+
autoDecryptDatabases(password: string): void;
|
|
228
|
+
createEncryptedBackup(dbPath: string, backupDir: string, password: string): string;
|
|
229
|
+
listEncryptedBackups(backupDir: string): string[];
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
interface SessionData {
|
|
233
|
+
[key: string]: any;
|
|
234
|
+
}
|
|
235
|
+
declare class SessionEncryptor {
|
|
236
|
+
private encryptor;
|
|
237
|
+
private key;
|
|
238
|
+
constructor(key?: string);
|
|
239
|
+
setKey(key: string): void;
|
|
240
|
+
private ensureKey;
|
|
241
|
+
encryptSession(sessionData: SessionData): string;
|
|
242
|
+
decryptSession<T extends SessionData>(encryptedData: string): T;
|
|
243
|
+
encryptValue(value: any): string;
|
|
244
|
+
decryptValue<T>(encryptedValue: string): T;
|
|
245
|
+
createSignedSession(sessionData: SessionData, secret: string): string;
|
|
246
|
+
verifySignedSession(signedSession: string, secret: string): {
|
|
247
|
+
valid: boolean;
|
|
248
|
+
data?: SessionData;
|
|
249
|
+
};
|
|
250
|
+
encryptCookie(sessionData: SessionData, password: string): string;
|
|
251
|
+
decryptCookie<T>(encryptedCookie: string, password: string): T;
|
|
252
|
+
generateSecureToken(length?: number): string;
|
|
253
|
+
hashData(data: string): string;
|
|
254
|
+
verifyHash(data: string, hash: string): boolean;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
type ShieldInstance = InstanceType<typeof Shield>;
|
|
258
|
+
interface WebArmorOptions {
|
|
259
|
+
config?: WebArmorConfig;
|
|
260
|
+
shield?: Shield;
|
|
261
|
+
}
|
|
262
|
+
declare function createWebArmor(config: WebArmorConfig): Promise<ShieldInstance>;
|
|
263
|
+
declare const _default: {
|
|
264
|
+
create: typeof createWebArmor;
|
|
265
|
+
Shield: typeof Shield;
|
|
266
|
+
FileEncryptor: typeof FileEncryptor;
|
|
267
|
+
ConfigEncryptor: typeof ConfigEncryptor;
|
|
268
|
+
DatabaseEncryptor: typeof DatabaseEncryptor;
|
|
269
|
+
SessionEncryptor: typeof SessionEncryptor;
|
|
270
|
+
Logger: typeof Logger;
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
declare const security: {
|
|
274
|
+
encrypt: (data: string, password: string) => string;
|
|
275
|
+
decrypt: (encryptedData: string, password: string) => string;
|
|
276
|
+
encryptFile: (inputPath: string, outputPath: string, password: string) => Promise<void>;
|
|
277
|
+
decryptFile: (inputPath: string, outputPath: string, password: string) => Promise<void>;
|
|
278
|
+
};
|
|
279
|
+
declare const createShield: typeof createWebArmor;
|
|
280
|
+
|
|
281
|
+
export { ConfigEncryptor, DatabaseEncryptor, FileEncryptor, type Framework, Logger, SessionEncryptor, Shield, type ShieldInstance, type WebArmorConfig, type WebArmorOptions, createShield, _default as default, security };
|