Últimamente las tiendas prestashop están recibiendo bastantes ataques de SPAM ruso. Prestashop tenía un pequeño parche oficial con una key interna que ha servido por un tiempo, pero los atacantes se han readaptado para vulnerar ese parche. Así que la solución al final ha sido meter el recapcha de google.

Como meter recapcha en formulario de contacto de prestashop 1.6

1:  Accedemos a la página de reCaptcha  y damos de alta una etiqueta, seleccionamos reCapcha v2 y metemos los dominios para los que serán válidas las claves.

2: A continuación, tenemos que meternos ya en el código de la plantilla, y meter el siguiente código en el header.tpl.

<script src='https://www.google.com/recaptcha/api.js'></script>

3: Ahora en el archivo contact-form.tpl de nuestra plantilla, insertamos el código que se ha generado en la web de reCAPTCHA de la sitekey, antes del botón de enviar, o dónde nos plazca siempre dentro del formulario.

<div class="g-recaptcha" data-sitekey="[sitekey generada por reCAPTCHA]"></div>

4: Por último, y puede que el punto más complicado, tenemos que meter este código:

elseif (!($gcaptcha = (int)(Tools::getValue('g-recaptcha-response'))))
$this->errors[] = Tools::displayError('Captcha no verificado');
Dentro de /controllers/front/ContactController.php entre los siguientes elseif. El extracto de código es de la versión 1.6.1.18, puede ser algo diferente de versiones anteriores o futuras que puedan ir sacando. Aunque con la llegada de la 1.7 no creo que sufra muchos cambios ya.
 if (!($from = trim(Tools::getValue('from'))) || !Validate::isEmail($from)) {
 $this->errors[] = Tools::displayError('Invalid email address.');
 } elseif (!$message) {
 $this->errors[] = Tools::displayError('The message cannot be blank.');
 } elseif (!Validate::isCleanHtml($message)) {
 $this->errors[] = Tools::displayError('Invalid message');
 } elseif (!($id_contact = (int)Tools::getValue('id_contact')) || !(Validate::isLoadedObject($contact = new Contact($id_contact, $this->context->language->id)))) {
 $this->errors[] = Tools::displayError('Please select a subject from the list provided. ');
 } elseif (!empty($file_attachment['name']) && $file_attachment['error'] != 0) {
 $this->errors[] = Tools::displayError('An error occurred during the file-upload process.');
 } 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)) {
 $this->errors[] = Tools::displayError('Bad file extension');
 } elseif ($url === false || !empty($url) || $saveContactKey != (Tools::getValue('contactKey'))) {
 $this->errors[] = Tools::displayError('An error occurred while sending the message.');
 } else {

Y quedaría de la siguiente forma:

 if (!($from = trim(Tools::getValue('from'))) || !Validate::isEmail($from)) {
 $this->errors[] = Tools::displayError('Invalid email address.');
 } elseif (!$message) {
 $this->errors[] = Tools::displayError('The message cannot be blank.');
 } elseif (!Validate::isCleanHtml($message)) {
 $this->errors[] = Tools::displayError('Invalid message');
 } elseif (!($id_contact = (int)Tools::getValue('id_contact')) || !(Validate::isLoadedObject($contact = new Contact($id_contact, $this->context->language->id)))) {
 $this->errors[] = Tools::displayError('Please select a subject from the list provided. ');
 } elseif (!empty($file_attachment['name']) && $file_attachment['error'] != 0) {
 $this->errors[] = Tools::displayError('An error occurred during the file-upload process.');
 } 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)) {
 $this->errors[] = Tools::displayError('Bad file extension');
 } elseif ($url === false || !empty($url) || $saveContactKey != (Tools::getValue('contactKey'))) {
 $this->errors[] = Tools::displayError('An error occurred while sending the message.');
 } elseif (!($gcaptcha = (int)(Tools::getValue('g-recaptcha-response')))) {
 $this->errors[] = Tools::displayError('Captcha no verificado');
 } else {
 Y con esto ya tendríamos nuestro formulario de contacto preparado para evitar ataques de SPAM, con el mejor capcha del mercado.
×
Hola! ¿Podemos ayudarte en algo?