Prestasohp 1.7 спам в клиентскую службу

Как и в случае с Joomla 1.5, часть спама обходит все JavaScript-проверки, отправляясь прямо в админку. Решений с капчей для Prestashop достаточно много, однако чего-либо стоимостью меньше 30€ для этого магазина никто не видел. Учитывая сомнительную эффективность капчи… В общем, если у вас есть опыт использования платных антиспам-плагинов для Prestashop, поделитесь им в комментариях. А я поделюсь ниже, как обойтись без них.

Первое, о чём хотелось бы предупредить: все изменения, описанные здесь затираются после первого же обновления компонентов — это совершенно отдельная тема, потому если нужно сделать толково, читайте документацию к движку, иначе при обновлении шаблона/компонента придётся всё переделывать.

Итак, для начала прибьём возможность ботам писать в клиентскую службу автоматически. Разработчики совершенно не озаботились даже о элементарной защите, видимо с прицелом на то, что купите платный модуль никуда не денетесь.

Нам понадобится шаблон формы постинга для обратной связи, у меня это contactform.tpl, путь к нему: /themes/название_темы/modules/contactform/views/templates/widget/ Открываем, листаем в самый низ, ищем кнопку «отправить». У меня она выглядит так:


Чтобы убрать возможность отправлять сообщения, но при этом не нарушить работу формы, удаляем из описания кнопки слово «submit» (после проверки, мы вернём его скриптом на место). Далее добавляем в конец документа код:

{literal}

{/literal}

Первые строки запрещают автоматическую отправку сообщения. Т.е. кнопка «отправить» станет активна только если пользователь нажмёт в текстовом поле с id = message (у вас могут быть варианты, в зависимости от шаблона, у меня текстовое поле для сообщения выглядит как

) хотя бы одну кнопку. По нажатию, мы возвращаем удалённый атрибут submit кнопке «отправить». Функция срабатывает однократно, потому нагрузки на браузер не создаёт.
Вторая функция проверяет перед отправкой сообщение на ключевые слова (в принципе, она не обязательна, далее мы сделаем ещё одну проверку на php), которые могут встречаться в сообщении и которые вас достали. В этом примере проверяется отсутствие пробелов (часто присылают просто абракадабру типа Vtx0hj, без пробелов). Можно например проверять наличие конкретного слова/слов:

if (stop_word.indexOf('viagra') != -1

И т.д. Если вы хоть немного знакомы с JavaScript, будет несложно.
Не забудьте обернуть всё это в «{literal}»: Prestashop сделан на smarty, без экранирующего оператора будет конфликт с остальным кодом.

Следующий этап — проверка на уровне модуля отправки самого Preestashop. Зачем? Два способа выше как оказалось не очень-то эффективны. Спамерам удаётся благодаря каким-то факторам JS-приблуды обходить. Потому ищем модуль отправки сообщений Preatshop contactform.php, путь: /modules/contactform/
Находим там строчку

public function sendMessage()

И после объявления переменных добавляем, чтобы получилось

        $extension = array('.txt', '.rtf', '.doc', '.docx', '.pdf', '.zip', '.png', '.jpeg', '.gif', '.jpg');
        $file_attachment = Tools::fileAttachment('fileUpload');
        $message = Tools::getValue('message');

        //spam check
        if (preg_match("/(spam_word)/i", $message)) {echo "Your message is send"; exit;}
        //end check

        if (!($from = trim(Tools::getValue('from'))) || !Validate::isEmail($from)) {

Что делает эта строка? Получает значение textarea, и прежде чем отправить, ищет в нём «spam_word» (пишете вместо него без кавычек ключевое слово; если их несколько — spam_word1|spam_word2 и т.д.) Когда ключевое слово есть в сообщении, сообщение не отправляется, при этом выводится «Your message is send» (это попытка обмануть живого спамера, если таковой имеет место быть).
Собственно, это всё. Не забываем сбрасывать кэш Престашопа после доработок.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

один + 18 =