/** * Security Test Suite for XSS Prevention * Tests malicious payload detection and sanitization */ import { sanitizeHtml, sanitizeSvg, sanitizeText, sanitizeUrl, validateImportedDrawing, sanitizeDrawingData, } from "./security"; console.log("๐Ÿงช Starting Security Test Suite...\n"); // Test 1: HTML/JS Sanitization console.log("Test 1: HTML/JS Sanitization"); const maliciousHtml = ` Normal text content `; const sanitizedHtml = sanitizeHtml(maliciousHtml); console.log("โœ… Original:", maliciousHtml.substring(0, 100) + "..."); console.log("โœ… Sanitized:", sanitizedHtml.substring(0, 100) + "..."); console.log("โœ… Script tags removed:", !sanitizedHtml.includes(" `; const sanitizedSvg = sanitizeSvg(maliciousSvg); console.log("โœ… Original:", maliciousSvg.substring(0, 100) + "..."); console.log("โœ… Sanitized:", sanitizedSvg.substring(0, 100) + "..."); console.log("โœ… SVG scripts removed:", !sanitizedSvg.includes("", "vbscript:msgbox('XSS')", "https://example.com", "/relative/path", "./current/path", "../parent/path", "mailto:test@example.com", ]; maliciousUrls.forEach((url) => { const sanitized = sanitizeUrl(url); const isSafe = sanitized !== ""; console.log(`โœ… "${url}" -> "${sanitized}" (${isSafe ? "SAFE" : "BLOCKED"})`); }); console.log(""); // Test 4: Text Sanitization with Length Limits console.log("Test 4: Text Sanitization with Length Limits"); const longText = "A".repeat(2000); const sanitizedLongText = sanitizeText(longText, 500); console.log( `โœ… Long text truncated: ${longText.length} -> ${sanitizedLongText.length} chars` ); const maliciousText = "Normal text"; const sanitizedText = sanitizeText(maliciousText); console.log(`โœ… Text sanitized: "${maliciousText}" -> "${sanitizedText}"`); console.log( "โœ… Malicious content removed:", !sanitizedText.includes("Malicious text", }, { id: "test2", type: "rectangle", x: 10, y: 10, width: 100, height: 100, angle: 0, version: 1, versionNonce: 1, link: "javascript:alert('XSS')", }, ], appState: { viewBackgroundColor: "", }, files: null, preview: '', }; console.log("Testing malicious drawing validation..."); const isValidDrawing = validateImportedDrawing(maliciousDrawing); console.log(`โœ… Malicious drawing rejected: ${!isValidDrawing}`); try { const sanitizedDrawing = sanitizeDrawingData(maliciousDrawing); console.log("โœ… Sanitization successful"); console.log(`โœ… Text sanitized: ${sanitizedDrawing.elements[0].text}`); console.log( `โœ… Link sanitized: ${sanitizedDrawing.elements[1].link || "null"}` ); console.log( `โœ… SVG sanitized: ${!sanitizedDrawing.preview?.includes("