Ejercicio: Seguridad y privacidad
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.
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.
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;
}