import {Request} from '@loopback/rest'; import {DEFAULT_XSS_CONFIG} from '../constants/security-defaults'; import {XssConfig} from '../types'; import {SecurityError} from '../utils/security-error'; import {SecurityLogger} from '../utils/security-logger'; /** * XSS detector that scans for cross-site scripting attack patterns */ export class XssDetector { private readonly defaultPatterns: RegExp[] = [ // Script tags /)<[^<]*)*<\/script>/gi, /]*>[\s\S]*?<\/script>/gi, /]*\/>/gi, // Iframe tags /)<[^<]*)*<\/iframe>/gi, /]*>[\s\S]*?<\/iframe>/gi, /]*\/>/gi, // JavaScript protocols /javascript:/gi, /vbscript:/gi, /data:text\/html/gi, /data:application\/javascript/gi, // Event handlers /on\w+\s*=\s*["'][^"']*["']/gi, /on(load|error|click|focus|blur|change|submit|reset|select|keyup|keydown|keypress|mouseover|mouseout|mouseup|mousedown)=/gi, // Malicious image sources /]*src\s*=\s*["']javascript:[^"']*["'][^>]*>/gi, /]*src\s*=\s*["']data:text\/html[^"']*["'][^>]*>/gi, // Object and embed tags /)<[^<]*)*<\/object>/gi, /]*>/gi, /)<[^<]*)*<\/applet>/gi, // Form tags with malicious actions /]*action\s*=\s*["']javascript:[^"']*["'][^>]*>/gi, // Meta refresh redirects /]*http-equiv\s*=\s*["']refresh["'][^>]*>/gi, // Style tags with expressions /]*>[\s\S]*?expression\s*\([^)]*\)[\s\S]*?<\/style>/gi, /<[^>]*style\s*=\s*["'][^"']*expression\s*\([^)]*\)[^"']*["'][^>]*>/gi, // Link tags with malicious hrefs /]*href\s*=\s*["']javascript:[^"']*["'][^>]*>/gi, // Base tag manipulations /]*href\s*=\s*["'][^"']*["'][^>]*>/gi, // Comments that might hide malicious code //gi, // Common XSS payloads /alert\s*\(/gi, /confirm\s*\(/gi, /prompt\s*\(/gi, /document\.cookie/gi, /document\.write/gi, /eval\s*\(/gi, /setTimeout\s*\(/gi, /setInterval\s*\(/gi, /window\.location/gi, /location\.href/gi, /location\.replace/gi, /location\.assign/gi, // SVG-based XSS /]*>[\s\S]*?<\/svg>/gi, /]*onload\s*=/gi, // Math ML XSS /]*>[\s\S]*?<\/math>/gi, // Encoded characters that might bypass filters /&#x[0-9a-fA-F]+;?/gi, /&#[0-9]+;?/gi, /%3C%73%63%72%69%70%74/gi, //