Saltar al contenido
Chatbots de WhatsApp desde cero
Temario

Ejercicio: Seguridad y privacidad

  • ⏱ 50 minutos
  • 📶 Nivel: avanzado

Objetivo

Escribir las cuatro funciones de defensa básicas del bot: enmascarar teléfonos, limpiar entradas, limitar la tasa de mensajes y decidir cuándo borrar un registro.

Cómo se trabaja

La parte A revisa tu propio proyecto con la lista de seguridad. La parte B son funciones de JavaScript puro. Las horas son números en milisegundos (Date.now()). Los teléfonos de ejemplo son falsos.

💡 Reto extra

Escribe anonimizar(pedido), que devuelva una copia del pedido con el teléfono enmascarado y sin dirección ni nombre, pero conservando productos y total. Es la forma de mantener estadísticas del negocio sin conservar datos personales.

▶ Prueba tu código aquí (opcional)
Consola

Pasos

Marca cada paso a medida que lo completes. Tu avance se guarda en este navegador.

💡 Pista 1: Enmascarar

String(tel ?? "").replace(/\D/g, "") deja solo dígitos. Con d.slice(0, 2) + "*".repeat(d.length - 5) + d.slice(-3) conservas los extremos.

💡 Pista 2: Limpiar

Encadena replace: primero /[​-‍]/g por "", luego /[\u0000-\u001F\u007F]/g por " ", luego /\s+/g por " "; después trim() y slice(0, max).

💡 Pista 3: Ventana deslizante

Filtra registro[clave] ?? [] dejando las horas con ahora - t < ventanaMs. Si quedan max o más, devuelve false; si no, añade ahora, guarda la lista y devuelve true.

🔎 Comprueba tu trabajo

Pega tu código y pulsa Comprobar. La revisión ocurre en tu navegador; nada se envía a ningún sitio. Cada punto en rojo incluye una pista. Pega solo el JavaScript, sin las etiquetas <script>.

    ✅ Ver una solución posible

    Intenta resolverlo antes de mirar. Tu versión puede ser distinta y también correcta.

    seguridad.js
    function enmascararTelefono(tel) {
      const d = String(tel ?? "").replace(/\D/g, "");
      if (d.length <= 5) return "*".repeat(d.length);
      return d.slice(0, 2) + "*".repeat(d.length - 5) + d.slice(-3);
    }
    
    function limpiarEntrada(texto, max = 500) {
      if (typeof texto !== "string") return "";
      return texto
        .replace(/[​-‍]/g, "")
        .replace(/[\u0000-\u001F\u007F]/g, " ")
        .replace(/\s+/g, " ")
        .trim()
        .slice(0, max);
    }
    
    function limitarTasa(registro, clave, ahora, max, ventanaMs) {
      const vivos = (registro[clave] ?? []).filter(t => ahora - t < ventanaMs);
      if (vivos.length >= max) {
        registro[clave] = vivos;
        return false;
      }
      vivos.push(ahora);
      registro[clave] = vivos;
      return true;
    }
    
    function debeBorrarse(registro, ahora, diasRetencion) {
      if (registro.solicitudBorrado) return true;
      return ahora - registro.creado >= diasRetencion * 24 * 60 * 60 * 1000;
    }