Seguridad
El WAF por reglas con puntuación — SQLi, XSS, path traversal y command injection.
import { checkRequest, checkMultipleInputs, type WafResult } from "@fesa/components/security";WAF por expresiones regulares con puntuación acumulada: cada regla suma puntos y el input se bloquea al llegar a 10 (BLOCK_THRESHOLD). Categorías: SQL injection, XSS, path traversal y command injection.
API
checkRequest(input: string): WafResult
checkMultipleInputs(inputs: Record<string, string>): WafResult
interface WafResult {
blocked: boolean
rule?: string // la regla que disparó el bloqueo
score: number
}Dónde se usa
En cada punto de entrada con texto libre — no como middleware global (defensa en profundidad):
export async function submitContactAction(values: ContactValues) {
const waf = checkMultipleInputs({
nombre: values.name,
mensaje: values.message,
});
if (waf.blocked) {
return { error: "La solicitud contiene contenido no permitido" };
}
// …
}Puntos típicos: login, registro, contacto, cotizaciones, checkout, chat.
Tests incluidos
La suite (413 líneas) viaja con la librería y corre en CI: payloads reales de SQLi/XSS/traversal/cmd-injection y casos legítimos que NO deben bloquearse (texto en español con acentos, código en mensajes de soporte). Una regla nueva protege todos los sistemas a la vez.
Qué queda en cada app (por ahora)
El rate-limiter Redis, el logger de eventos de seguridad y las alertas por correo de FesaStore
dependen de ioredis/pino/Resend — se extraerán cuando se unifique el transporte. Mientras,
la librería ofrece MemoryRateLimitService en utilidades.