Listo (Ctrl + Enter para ejecutar) Bootcamp Fullstack »
app.js
Tab = 4 espacios
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
Vista Previa
Consola Virtual JavaScript