Spam del formulario de contacto de PrestaShop: por qué un antispam de palabras prohibidas no funciona

por Luca Cavallini Guías técnicas
Spam del formulario de contacto de PrestaShop: por qué un antispam de palabras prohibidas no funciona

Dos maneras de perder tiempo, y la segunda es peor

En el buzón que recibe los mensajes del formulario de contacto llegan dos cosas: las consultas de los clientes y las propuestas no solicitadas, es decir, posicionamiento, netlinking, desarrolladores por horas, invitaciones a invertir en criptomonedas y, de vez en cuando, un intento de que le entreguen las credenciales del back office.

La primera manera de perder tiempo es leerlo todo. La segunda, peor, es dejar de leer: cuando casi todo es basura, el mensaje bueno solo se mira de pasada. Un contacto perdido no deja ningún error en los logs, deja a un cliente que se va sin decir por qué.

Por qué una lista de palabras prohibidas no funciona

La defensa más extendida es una lista de palabras: si el mensaje contiene «SEO», «gratis», «oferta», se descarta. Funciona una semana, y luego llega la factura, porque las palabras que aparecen en el spam son las mismas que usan los clientes. «He visto que tienen una promoción en el maletín de destornilladores, ¿el envío es gratis a partir de 49 euros incluso a las islas?» es un cliente a punto de comprar.

El defecto no está en la lista, está en el método: una palabra no lleva consigo la intención de quien la ha escrito. Y es cierto también en sentido contrario, porque un spam bien escrito no contiene ninguna palabra sospechosa. Al subir la severidad se bloquea a más clientes reales; al bajarla se deja pasar más spam: ningún ajuste resuelve el problema, porque no es la señal adecuada.

Una lista de palabras prohibidas (SEO, gratis, oferta) bloquea el mensaje de un cliente que pregunta por la promoción y el envío gratis, mientras que un spam bien escrito sin esas palabras pasa
El fallo no está en la lista sino en el método: una palabra no lleva consigo la intención de quien la escribió.

Por qué el captcha no basta

El captcha resuelve un problema distinto, y lo resuelve bien: impide que un programa rellene el formulario miles de veces. No impide que una persona envíe una propuesta comercial, ni que lo haga un programa capaz de resolverlo. Captcha, honeypot y límite de envíos por IP miran cómo ha llegado el mensaje; aquí, el problema es lo que hay escrito dentro.

Comparación: captcha, honeypot y límite por IP detienen los programas que rellenan el formulario, pero una persona que envía una propuesta comercial pasa; para el contenido hace falta algo que lea el texto
El captcha resuelve bien su problema; el de los mensajes no deseados escritos por personas es otro.

Un modelo que decide en lugar de escribir

La respuesta de moda a «¿es spam este mensaje?» consiste en consultar un modelo de lenguaje: se escribe un prompt y se espera que el texto devuelto se pueda interpretar. Funciona hasta el día en que el modelo responde «Diría que sí, aunque depende», y el código que esperaba SÍ o NO decide al azar.

Existe un tipo de modelo pensado para el caso opuesto: no genera texto, responde a preguntas tipadas. Devuelve una cifra para cada una: para una pregunta de sí o no, la probabilidad de que la respuesta sea sí; para una pregunta de opción múltiple, la opción elegida, la probabilidad de cada una y un índice de confianza, es decir, cuán nítida es esa elección frente a las demás. La función Antispam Jev de nuestro módulo de formularios de contacto está construida sobre uno de estos modelos, Jev de TypeSafe AI.

La diferencia práctica es que la decisión se queda en el código: el modelo dice lo seguro que está, y lo que se hace con eso lo decide un umbral que el comerciante puede modificar. Por cada mensaje salen seis preguntas en una sola llamada, evaluadas en paralelo: si es publicidad no solicitada, si contiene enlaces sospechosos, si es phishing, si es una plantilla enviada de forma masiva, qué departamento debería responder y si es urgente.

Esquema: el mensaje del formulario de contacto va a Jev con seis preguntas evaluadas en paralelo, publicidad, enlaces sospechosos, phishing, plantilla masiva, departamento, urgencia, y vuelve un número por cada una
Ningún texto que interpretar: seis respuestas numéricas, y la decisión se queda en el código del módulo.

El punto más importante es el tercer estado. Por encima del umbral alto se actúa y el mensaje va a una cola de mensajes sospechosos; por debajo no se hace nada, pasa, y la evaluación queda en el registro; entre ambos, donde el modelo duda, hace falta la confirmación de una segunda señal. «No lo sé» es una respuesta útil, si el código está escrito para escucharla.

Escala de probabilidad con dos umbrales: por debajo el mensaje pasa y la evaluación queda en el registro, en medio hace falta una segunda señal, por encima del umbral alto va a la cola de sospechosos
Los umbrales los elige el comerciante; el modelo solo dice lo seguro que está.

Lo que hemos medido

Estas cifras proceden de una prueba que hicimos en una instalación de desarrollo de PrestaShop 9, no de un test independiente: diez mensajes redactados por nosotros en italiano, seis legítimos y cuatro no deseados.

Los seis legítimos se habían elegido para que resultaran difíciles: un cliente enfadado que pide el reembolso y amenaza con impugnar el pago ante su banco, un mensaje escrito todo en mayúsculas, uno con el enlace a la web de su empresa, uno larguísimo y confuso, uno brevísimo en italiano («¿Envían a Sicilia?») y el que está lleno de «gratis», «oferta» y «promoción». Los seis pasaron, con una probabilidad de publicidad no solicitada que se quedó en un 2 % o menos. Los cuatro no deseados (propuesta SEO, phishing con enlace acortado, invitación a invertir, plantilla genérica enviada de forma masiva) fueron todos a la cola de sospechosos, entre un 98 % y un 99 %.

Las diez llamadas tardaron entre 535 y 663 milisegundos, con una media de 596 ms, consumiendo unos 900 a 1.240 tokens por mensaje. Con la función desactivada, el mismo envío tardó 95 ms: el medio segundo de más es el precio de la evaluación, y solo se paga si se activa.

La prueba que más nos interesaba era otra: apuntamos el módulo a una dirección que no responde. Pasados 4.057 milisegundos, es decir, el tiempo de espera configurado, el mensaje se entregó con normalidad y el error quedó anotado en el registro. Lo mismo ocurre si falta la clave o si es errónea.

Resultados de la prueba: 6 de 6 mensajes legítimos pasaron, 4 de 4 no deseados en la cola, 596 ms de media entre 535 y 663 ms, 900-1.240 tokens por mensaje, tiempo de espera de 4.057 ms con el mensaje entregado
Diez mensajes dicen que el filtro no se equivocó en esos diez, no que nunca se vaya a equivocar: por eso existe la cola.

Lo que no hace, a propósito

No elimina nada. El spam reconocido va a una cola que el comerciante abre, lee, y de la que puede recuperar un mensaje con un clic, en cuyo caso se envía la notificación que había quedado retenida. El visitante ve de todos modos la pantalla de confirmación: no se le explica a quien envía spam cómo se le ha filtrado, y un cliente que acabara ahí por error no se ve rechazado.

No pasa por encima de las decisiones del comerciante: el encaminamiento elige entre los departamentos realmente configurados en el módulo y solo interviene allí donde antes se habría usado la dirección genérica. Por debajo del umbral de confianza, se queda el destinatario por defecto.

Los límites, dichos de antemano

El texto del mensaje se envía a un proveedor externo en Estados Unidos: es una transferencia de datos personales fuera de la Unión Europea, que debe figurar en la política de privacidad de la tienda. Por eso la función viene desactivada por defecto, el panel indica con todas las letras qué sale y hacia quién, el envío de la dirección de correo del remitente está desactivado salvo elección explícita, y el módulo proporciona una frase lista para pegar en la política de privacidad en cinco idiomas: un texto que hay que adaptar y hacer revisar, no un dictamen jurídico.

El servicio es reciente y se factura por consumo: cuando se agota el crédito, deja de responder, y los mensajes pasan como en cualquier otro error. Y diez mensajes dicen que, en esos diez, el filtro no se equivocó, no que nunca se vaya a equivocar: por eso existe la cola, y por eso cada evaluación se registra con probabilidad, confianza, tiempo y tokens.

Dónde encontrarla

Antispam Jev es una función de nuestro módulo de formularios de contacto para PrestaShop, no un módulo aparte: quienes ya lo utilizan la encuentran en la configuración, desactivada. Si el problema que usted reconoce es el segundo de este artículo, el mensaje real que se pierde entre los demás, es para el que se creó.

Captura de la función Antispam Jev del módulo de formularios de contacto en la demo de PrestaShop 9: si falta la clave API la función está inactiva, luego qué evaluar y los umbrales de cola, confirmación, departamento y urgencia
Antispam Jev en el módulo cll_contactform de nuestra demo de PrestaShop 9: apagada hasta que se introduce una clave, con los umbrales que deciden qué pasa (back office en italiano).

Formularios de Contacto Avanzados (Advanced Contact Forms)Crea varios formularios de contacto avanzados con builder de campos personalizados, enrutamiento por…49,99 €Ver producto

Deje un comentario

Los comentarios se moderan antes de su publicación.

← Blog

Cargando...
Volver arriba