UNPKG

js-firewall-creatorseojun-123

Version:

실시간 사용자 행동을 분석하여 보안 위협을 감지하는 JS 라이브러리

119 lines (102 loc) 3.15 kB
const BehavioralFirewall = (() => { let config = { mode: "strict", onDetected: (type) => console.warn("[Firewall] Threat Detection:", type), reportUrl: null, }; let lastClick = 0; let mouseMoves = 0; let keyPresses = 0; let startTime = Date.now(); let lastActivityTime = Date.now(); let idleCheckInterval; let lastMouseX = null; let lastMouseY = null; let lastMouseMoveTime = null; function init(userConfig) { config = { ...config, ...userConfig }; document.addEventListener("click", handleClick); document.addEventListener("mousemove", handleMouseMove); document.addEventListener("keydown", handleKeyPress); window.addEventListener("blur", () => report("tab-blur")); idleCheckInterval = setInterval(checkIdle, 10000); } function handleClick() { const now = Date.now(); if (now - lastClick < 50) { report("click-spam"); } lastClick = now; lastActivityTime = now; } function handleMouseMove(event) { const now = Date.now(); mouseMoves++; lastActivityTime = now; if (lastMouseX !== null && lastMouseY !== null && lastMouseMoveTime !== null) { const dx = event.screenX - lastMouseX; const dy = event.screenY - lastMouseY; const dt = now - lastMouseMoveTime; const distance = Math.sqrt(dx * dx + dy * dy); const speed = distance / dt; // px/ms if (speed > 35) { report("mouse-speed-abnormal"); } } lastMouseX = event.screenX; lastMouseY = event.screenY; lastMouseMoveTime = now; } function handleKeyPress() { keyPresses++; lastActivityTime = Date.now(); } function checkIdle() { const now = Date.now(); const idleTime = (now - lastActivityTime) / 1000; if (idleTime >= 90) { report("idle-over-90sec"); } const elapsed = (now - startTime) / 1000; if (elapsed > 5) { if (mouseMoves === 0) { report("no-mouse-activity"); } if (keyPresses === 0 && mouseMoves > 10) { report("no-typing-with-activity"); } mouseMoves = 0; keyPresses = 0; startTime = now; } } function report(type) { if (config.mode === "strict") { config.onDetected(type); if (config.reportUrl) { try { fetch(config.reportUrl, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ type, timestamp: new Date().toISOString(), userAgent: navigator.userAgent }) }).catch(err => console.error("[Firewall] Server transfer failure (catch):", err)); } catch (err) { console.error("[Firewall] Server transfer failure (try):", err); } } } else { console.log("[Firewall] Server transfer failure:", type); } } function stop() { clearInterval(idleCheckInterval); document.removeEventListener("click", handleClick); document.removeEventListener("mousemove", handleMouseMove); document.removeEventListener("keydown", handleKeyPress); } return { init, stop }; })();