Спам в комментариях (Simpla CMS)

Как только магазин становится достаточно популярным, с покупателями обязательно приходят спамеры. Борьба со спамом — откровенно слабая сторона этого движка, стандартная капча совершенно неэффективна. Обзор существующих решений как правило приводит к платным плагинам и доработкам или бесплатным советам прикрутить гугл-капчу. Обе идеи неплохи если у вас много денег или много времени, в противном случае быстренько допиливаем всё самостоятельно.

Первое и самое простое решение находится на форуме (решений там несколько, но это самое быстрое в исполнении и самое действенное на мой взгляд). Лежит вот здесь, но я лучше разложу его по полочкам (версия магазина 2.3.7).

Открываем /view/ProductView.php и ищем выражение

elseif (empty($comment->text))

Собственно, оно проверяет тело комментария на содержимое, если там ничего нет — выдаёт ошибку. Заменяем его на:

elseif ((empty($comment->text)) OR (!stristr($comment->text, 'http') === FALSE))

Здесь мы добавляем проверку содержимого комментария на аббревиатуру «http» (можете подставить своё), т.к. 99% спама содержит ссылки на сайты, это должно такие комментарии отсеять.
Внимание! Ахтунг! Аттэншн!
Т.к. обработчиков для комментариев два (одно для товара и одно для блога), то же самое нужно будет сделать и в файле BlogView.php


Способ второй, в принципе, более сложный но и более информативный для пользователей.
Нам понадобится файл шаблона для товара (обычно это product.tpl по адресу /design/название_шаблона/html/). Ищем там форму отправки комментария, скорее всего будет что-то вроде

Написать комментарий

{if $error}
{if $error=='captcha'} Неверно введена капча {elseif $error=='empty_name'} Введите имя {elseif $error=='empty_comment'} Введите комментарий {/if}
{/if} {...}

В форме ищем кнопку отправки комментария, у меня это


Удаляем её, вместо неё вставляем

											{literal}
												
											{/literal}

										
											{literal}
												
											{/literal}

Коротко поясню, что тут собственно происходит. Защита двухуровневая (учитывая, что большинство спам-ботов не умеют в js, то даже трёх): во-первых, скрипт выше не даёт ввести имя латиницей (чем грешит большинство ботов и немножко нехороших людей), о чём тут же пользователя предупреждает, держа при этом фокус в поле «имя». Во-вторых, после нормального ввода имени, второй скрипт просит ввести возраст, тут же проверяя число на «вменяемость» (некоторые боты с лёгкостью обходят этот этап без данной проверки, просто вводя произвольное число) от 15и до 66и. Вы можете конечно подставить свои значения. И только после всех проверок проверяется капча и происходит отправка сообщения. (Внимание! На некоторых шаблонах после доработки перестаёт работать предупреждение о неверном вводе капчи, сообщение вроде как отправляется, но на самом деле ничего не происходит. Этот момент желательно протестировать.)

Недостаток метода в том, что особо умным ботам не нужна даже форма отправки комментария, специальным POST-запросом они отправляют спам напрямую в мозг движок. А потому я рекомендую использовать оба способа по возможности (хотя первый конечно надёжнее). Можно модифицировать первый способ, отрезав возможность писать например «имя» латиницей на уровне обработчика.
Для примера, это строка в ProductView.php

elseif (empty($comment->name))

её заменяем на

			elseif ((empty($comment->name)) or (preg_match("/^[a-z\d]{1}[a-z\d\s]*[a-z\d]{1}$/i", $comment->name)))

и всё, комментарий с именем, содержащим хоть одну латинскую букву улетает в dev/null. Можно так же модифицировать проверку тела комментария с подобным условием. В общем, тут вы ничем не ограничены.

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

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

10 + пятнадцать =