1
// 1. Demostración de Backtracking con Rendimiento Medido
// Patrón vulnerable con cuantificadores anidados: /(a+)+$/
const patronPeligroso = /^(a+)+$/;
// Patrón optimizado y lineal: /^a+$/
const patronSeguro = /^a+$/;
function medirTiempo(etiqueta, fn) {
const inicio = performance.now();
const resultado = fn();
const fin = performance.now();
console.log(`${etiqueta}: ${(fin - inicio).toFixed(3)} ms (Resultado: ${resultado})`);
}
console.log("--- 1. Prueba de Rendimiento: Cadena Válida ('a' x 20) ---");
const cadenaValida = "a".repeat(20);
medirTiempo("Patrón Seguro ", () => patronSeguro.test(cadenaValida));
medirTiempo("Patrón Peligroso", () => patronPeligroso.test(cadenaValida));
console.log("\n--- 2. Ataque ReDoS: Cadena Inválida ('a' x 24 + '!') ---");
const cadenaAtaque = "a".repeat(24) + "!";
// El patrón seguro falla de inmediato en 1 paso
medirTiempo("Patrón Seguro ", () => patronSeguro.test(cadenaAtaque));
// El patrón peligroso intenta miles de permutaciones antes de fallar
medirTiempo("Patrón Peligroso", () => patronPeligroso.test(cadenaAtaque));
// 3. Alternativa Nativa para Validación de URLs (Sin Regex)
console.log("\n--- 3. Validación de URL con API Nativa URL() ---");
function esUrlValida(posibleUrl) {
try {
const parsed = new URL(posibleUrl);
return parsed.protocol === "http:" || parsed.protocol === "https:";
} catch {
return false;
}
}
console.log("https://academia.kilopolis.com =>", esUrlValida("https://academia.kilopolis.com"));
console.log("ht!tp://direccion_invalida =>", esUrlValida("ht!tp://direccion_invalida"));
Haz clic para editar este código