DominioZero

Luchando contra el spam ruso en PrestaShop

Solución contra el spam ruso en Prestashop

¿Se acaban de dar de alta cientos de clientes en tu tienda?

¿Tu marketing está funcionando a las mil maravillas? ¿O quizá será spam en el alta de cliente?

Si no estás de suerte y tu caso es que te está entrando spam como registros de cliente, entonces lo tienes muy fácil para resolverlo y te explicamos como.

Índice

  1. Solución contra el spam ruso en PrestaShop
  2. ¿De dónde viene el spam?
  3. Marcando a nuestro enemigo
  4. Yendo un poco más allá

Editado: abril 2018

Finalmente, la manera de solucionar el probla del spam en PrestaShop pasa por editar dos archivos de tu tienda PrestaShop: ContactController.php y contact-form.tpl

En tu instalación ve a /controllers/front/ContactController.php y edita las siguientes filas (añade las que tienen un + al inicio y elimina las que tienen un -):

  1. public function postProcess()
  2. {
  3. if (Tools::isSubmit(‘submitMessage’)) {
  4. + $saveContactKey = $this>context>cookie>contactFormKey;
  5. $extension = array(‘.txt’, ‘.rtf’, ‘.doc’, ‘.docx’, ‘.pdf’, ‘.zip’, ‘.png’, ‘.jpeg’, ‘.gif’, ‘.jpg’);
  6. $file_attachment = Tools::fileAttachment(‘fileUpload’);
  7. $message = Tools::getValue(‘message’); // Html entities is not usefull, iscleanHtml check there is no bad html tags.
  8. + $url = Tools::getValue(‘url’);
  9. if (!($from = trim(Tools::getValue(‘from’))) || !Validate::isEmail($from)) {
  10. $this>errors[] = Tools::displayError(‘Invalid email address.’);
  11. } elseif (!$message) {
  12. $this>errors[] = Tools::displayError(‘The message cannot be blank.’);
  13. } elseif (!Validate::isCleanHtml($message)) {
  14. $this>errors[] = Tools::displayError(‘Invalid message’);
  15. } elseif (!($id_contact = (int)Tools::getValue(‘id_contact’)) || !(Validate::isLoadedObject($contact = new Contact($id_contact, $this>context>language>id)))) {
  16. $this>errors[] = Tools::displayError(‘Please select a subject from the list provided. ‘);
  17. } elseif (!empty($file_attachment[‘name’]) && $file_attachment[‘error’] != 0) {
  18. $this>errors[] = Tools::displayError(‘An error occurred during the file-upload process.’);
  19. } elseif (!empty($file_attachment[‘name’]) && !in_array(Tools::strtolower(substr($file_attachment[‘name’], 4)), $extension) && !in_array(Tools::strtolower(substr($file_attachment[‘name’], 5)), $extension)) {
  20. $this>errors[] = Tools::displayError(‘Bad file extension’);
  21. + } elseif ($url === false || !empty($url) || $saveContactKey != (Tools::getValue(‘contactKey’))) {
  22. + $this>errors[] = Tools::displayError(‘An error occurred while sending the message.’);
  23. } else {
  24. $customer = $this>context>customer;
  25. if (!$customer>id) {
  1. + $contactKey = md5(uniqid(microtime(), true));
  2. + $this>context>cookie>__set(‘contactFormKey’, $contactKey);
  3. +
  4. $this>context>smarty>assign(array(
  5. ‘contacts’ => Contact::getContacts($this>context>language>id),
  6. ‘message’ => html_entity_decode(Tools::getValue(‘message’))
  7. + ‘message’ => html_entity_decode(Tools::getValue(‘message’)),
  8. + ‘contactKey’ => $contactKey,

Guarda este archivo y ve a /themes/TU-TEMA/contact-form.tpl para añadir estas dos líneas:

  1. </div>
  2. </div>
  3. <div class=«submit»>
  4. + <input type=«text» name=«url» value=»» class=«hidden» />
  5. + <input type=«hidden» name=«contactKey» value=«{$contactKey}» />
  6. <button type=«submit» name=«submitMessage» id=«submitMessage» class=«button btn btn-default button-medium»><span>{l s=’Send’}<i class=«icon-chevron-right right»></i></span></button>
  7. </div>
  8. </fieldset>

Guárdalo también y listo. Comprueba el número de correos no deseados que llegan a tu bandeja de entrada.

Si necesitas ayuda para implementar esta solución, no dudes en contactar con nosotros. Llámanos al 981.059.629 o escríbenos a soporte@dominiozero.es.

Si estás leyendo esto, probablemente hayas visto que tu correo se llena cada día con mensajes en ruso procedentes del formulario de contacto de tu tienda PrestaShop.

Incluso es posible que hayas intentado instalar un reCaptcha en la página de contacto, siguiendo las indicaciones de este manual.

Sí, es cierto, durante un par de días no llega spam, pero al tercero volvemos al punto de partida.

Pues bien, ha llegado la hora de ponerse serios con los «ruskis» y ser un poco más estrictos.

En nuestro caso (tenemos varios clientes con tiendas PrestaShop), el reCaptcha de Google y el cambio de URL de la página de contacto no solucionaron el problema, así que vamos a ir a por sus direcciones IP.

Hemos visto que estos spammers utilizan un número relativamente reducido de IPs, así que vamos a aprovecharnos de ello. Veamos cómo hacerlo.

¿De dónde viene el spam?

Lo primero es saber desde dónde nos envían sus maravillosas ofertas para disfrutar de unas ayudas del gobierno ruso, que por alguna extraña razón pagan en dólares y no en rublos (nada sospechoso, ¿verdad?).

Para ello necesitamos modificar dos archivos de nuestra instalación.

El primero de los archivos es /controllers/front/ContactController.php

Entre las líneas 150 y 170 encontraremos este fragmento:

  1. if (!count($this>errors)) {
  2. $var_list = array(
  3. ‘{order_name}’ => ‘-‘,
  4. ‘{attached_file}’ => ‘-‘,
  5. ‘{message}’ => Tools::nl2br(stripslashes($message)),
  6. ‘{email}’ => $from,
  7. ‘{product_name}’ => »,
  8. );

En este fragmento debemos insertar la siguiente línea:

 

‘{ipaddress_cliente}’ => Tools::getRemoteAddr(),

 

El fragmento quedaría de la siguiente manera:

  1. if (!count($this>errors)) {
  2. $var_list = array(
  3. ‘{order_name}’ => ‘-‘,
  4. ‘{attached_file}’ => ‘-‘,
  5. ‘{message}’ => Tools::nl2br(stripslashes($message)),
  6. ‘{email}’ => $from,
  7. ‘{product_name}’ => »,
  8. ‘{ipaddress_cliente}’ => Tools::getRemoteAddr(),
  9. );

Guarda el archivo y sustituye el del servidor.

El siguiente archivo a modificar es /themes/TU_TEMA/mails/XX/contact.tpl

TU_TEMA es el tema activo en la tienda y XX es el identificador del idioma, en nuestro caso «es».

Sobre la línea 9, al final de todo y justo después del elemento {attached_file}, añadiremos el siguiente fragmento:

  1. <br /> <span style=«color: #333;»><strong>IP del remitente:</strong></span> {ipaddress_cliente}

De nuevo, guarda y sube.

A partir de este momento, cada vez que te llegue uno de estos mensajes de spam, verás al final la dirección IP del remitente. Empezamos a ver de dónde vienen estas joyitas.

Marcando a nuestro enemigo

Según vayamos recibiendo esta información, debemos marcar las IPs en nuestra lista negra de remitentes, utilizando iptables. A continuación puedes ver un ejemplo para CentOS:

  1. [root@serv ~]# yum install ipset
  2. [root@serv ~]# ipset create blacklist hash:ip hashsize 4096
  3. [root@serv ~]# iptables -I INPUT -m set –match-set blacklist src -j DROP
  4. [root@serv ~]# iptables -I FORWARD -m set –match-set blacklist src -j DROP
  5. [root@serv ~]#service iptables save
  6. [root@serv ~]#service iptables restart
  7. [root@serv ~]# ipset add blacklist X.X.X.X

Con estos comandos en el terminal o la consola, instalaremos iptables en nuestro servidor (también se puede hacer desde el instalador de RPM de WHM), crearemos una lista negra y añadiremos nuestra primera IP (sustituye X.X.X.X por la IP que quieras añadir).

A partir de este momento, cada vez que detectes spam desde una IP nueva, sólo tienes que utilizar el comando.

  1. [root@serv ~]# ipset add blacklist X.X.X.X

y estará agregada a la lista negra.

Yendo un poco más allá

Espera, espera… Pero si el reCaptcha no funciona, ¿significa eso que tengo que estar pendiente de las IPs de los correos? ¿Para siempre?

Vale, es cierto, no es un plan perfecto, así que vamos a ponérselo un poco más complicado a los spammers.

Crearemos un campo adicional en nuestro formulario de contacto. Un campo que nuestros clientes no verán o, si lo ven, sabrán qué hacer. Para «Botsky», nuestro amigo robótico del Este, será un campo como cualquier otro, e intentará escribir una URL en él. Veamos cómo funciona…

Vamos a abrir la plantilla de la página de contacto. Normalmente será /themes/TU_TEMA/contact-form.tpl.

Dependiendo de tu tema, esta plantilla será más o menos compleja y deberás adaptarte a lo que encuentres. Nosotros te mostramos la versión simplificada:

  1. <form action=«/submit.php» method=«post»>
  2. <p>Your name: <input type=«text» name=«name» /></p>
  3. <p>Your email: <input type=«text» name=«email» /></p>
  4. <p class=«campo_botsky»>Deja este cuadro en blanco: <input type=«text» name=«url» /></p>
  5. <p><textarea name=«message»></textarea></p>
  6. <p><input type=«submit» value=«Send» /></p>
  7. </form>

Como puedes ver, en la línea 4 hemos añadido un campo extra. Esta será nuestra trampa para cazar al pequeño «Botsky».

En nuestro archivo CSS, que suele ser /themes/TU_TEMA/css/global.css, añadiremos al final una línea extra:

  1. .campo_botsky {display:none;}

De esta forma, nos aseguramos de que nuestros clientes reales no ven este campo.

En cualquier caso, si utilizan un navegador raro y lo viesen, verían el mensaje que les dice que ahí no deben escribir nada.

Como puedes ver, el nombre del campo es «url», confundiendo al bot y haciéndole pensar que ahí debe poner una URL.

Ha llegado el momento de preparar nuestra trampa…

Para atraparlos, crearemos una regla en el servidor que diga que si el usuario ha escrito algo en este campo, lo descarte. Este es el código PHP:

  1. <?php
  2. // si el campo url está vacío
  3. if(isset($_POST[‘url’]) && $_POST[‘url’] == »){
  4. // envía el formulario a tu correo
  5. mail( ‘tu@tutienda.com’, ‘Formulario contacto’, print_r($_POST,true) );
  6. }
  7. // de lo contrario, dejemos que crea que ha enviado su mensaje
  8. ?>
  9. <h1>¡Gracias!</h1>
  10. Te responderemos tan pronto como nos sea posible.

Como comentábamos antes, un usuario normal ni siquiera verá el campo en cuestión, de manera que lo dejará en blanco sin pensarlo. Si el CSS falla, verán una nota que les indica que deben dejarlo en blanco.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)
Salir de la versión móvil