js-firewall-creatorseojun-123
Version:
실시간 사용자 행동을 분석하여 보안 위협을 감지하는 JS 라이브러리
119 lines (102 loc) • 3.15 kB
JavaScript
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 };
})();