Антиспам или улучшение CAPTCHA в K2

Дата Автор 

Всем привет! Как вы уже поняли из названия темы, сегодняшняя статья будет об антиспаме или как улучшить защиту от спама. Если вы читали мой предыдущий пост, то уже знаете, что за последнее время мой блог частенько атакуют спамеры. 

Антиспам

Я даже придумал, как узнать ip адрес этих товарищей, об этом вы так же можете почитать в прошлой статье. Но через несколько дней я понял, что, спамеров много и я запарюсь постоянно удалять их сообщения и банить их ip. Тогда я начал действовать, и если вам интересно, что я придумал, то читайте пост далее.

 

Стандартная reCAPCHA не помогает, её с легкостью обходят с помощью специальных программ и сервисов распознавания капчи. Да и многих отталкивает капча, в которой, нужно вводить непонятные символы.  Да чего уж там таить, меня самого бесят эти кракозябры. Но защита нужна в любом случае. Я начал искать различные модули или плагины для Joomla, которые будут совместимы с K2. Таких оказалось очень мало и все было не, то что я хотел, а переделывать что-то чужое хуже некуда, легче создать своё.

 

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

 

В самую первую очередь соединитесь со своей базой данных, и таблице #_k2_users и #_k2_comments создайте поле со следующими параметрами:

 

Поле:  commentantibot

Тип: INT

По умолчанию: Как определено (и ниже в окошке поставьте цифру - 1)

 

Остальные параметры добавлять не надо. Также в таблице #_users необходимо создать поле со следующими параметрами:

 

Поле: antibot

Тип: INT

По умолчанию: Как определено (и ниже в окошке поставьте цифру - 1)

 

Зачем нужны все эти поля и почему их надо создать сразу, объясню позже, а пока будем редактировать код.  Для начала отправляемся по пути /components/com_k2/templates/default и откроем для редактирования файл item_comments_form.php.

 

В нем необходимо найти строчку <?php if($this->params->get('recaptcha') && $this->user->guest): ?> и перед ней добавить следующий код:

 

<?php if($this->user->guest): ?>

Активируйте checkbox если вы не бот <input type="checkbox" name="commentantibot" id="commentantibot"  /> *<br>

<?php endif; ?>

 

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

 

 Текст можете написать любой, он предназначен для пользователей, а вот код после, сейчас объясню. Ну, тег input понятен по своему названию, то есть необходимо что-то ввести. Тип у этого тега “checkbox”, то есть установить флажок.  Атрибутам name и id должны быть присвоены значения commentantibot, это необходимо для отправления введенных данных в базу данных. Ну и звездочка указывает, что поле обязательно для заполнения.

 

тематические блоги

 

Тут мы все сделали, теперь отправляемся редактировать модель, в которой происходят условия проверки пользователя, заполнения обязательных полей и т.д. Файл модели находиться в папках /components/com_k2/models называется он item.php. В нем нужно найти функцию comments (function comments ()). Нам нужен этот кусок кода:

 

 

if(!$user->guest)                                           

      {

       $row->userID = $user->id;

       $row->commentEmail = $user->email;

       $row->userName = $user->name;

       $row->commentantibot = $user->antibot;

      }

 

       $userName = trim($row->userName);

       $commentEmail = trim($row->commentEmail);

       $commentText = trim($row->commentText);

       $commentURL = trim($row->commentURL);

       $commentantibot = trim($row->commentantibot);

 

       if (empty($userName) || $userName == JText::_('K2_ENTER_YOUR_NAME') || empty($commentText) || $commentText == JText::_('K2_ENTER_YOUR_MESSAGE_HERE') || empty($commentEmail) || $commentEmail == JText::_('K2_ENTER_YOUR_EMAIL_ADDRESS') || empty($commentantibot) || $commentantibot == JText::_('Поставьте галочку, если вы не бот') )

 

Строк выделенных жирным у вас не будет, так как именно их вам надо будет добавить. Ну, начну объяснять, для чего нужны эти строки. Сначала объясню про добавляемые строки, а потом объясню как это все работает.

 

$row->commentantibot = $user->antibot;

Этой строкой мы указываем, что при отправлении комментария, в поле commentantibot таблицы #_k2_comments, будут передаваться данные пользователя из поля antibot таблицы #_users.

 

$commentantibot = trim($row->commentantibot);

Эта строчка добавляет поле для отправления и проверки на заполнение данных гостями.

 

 empty($commentantibot) || $commentantibot == JText::_('Поставьте галочку, если вы не бот')

Если поле $commentantibot пустое, тогда будет выводиться сообщение с текстом «Поставьте галочку, если вы не бот»

 

Да! Чуть не забыл упомянуть одну ВАЖНУЮ фишку, если после того как вы сделаете все как написано в моей статье и зарегистрированные пользователь не сможет отправить комментарий, то просто подождите, некоторое время и все заработает. Честно скажу не знаю почему так, если вы знаете буду признателен если поделитесь.

 

Собственно говоря, вот и все, что вам нужно для создания такой же капчи как у меня. А теперь если вам интересно я объясню, как все это работает.

 

Для гостей:  Тут все просто, все заполненные поля проходят все проверки и если все хорошо отправляются в БД. Как тут работает капча? Все просто, изначально у checkbox'a нет никакого значения, следовательно, отправляя комментарий с пустым чекбоксом, мы отправляем пустое поле, которое не проходит проверку на заполнение. Как только мы активируем чекбокс (ставим галочку) оно принимает значение «0», тем самым переставая быть пустым и комментарий спокойно добавляется.

 

 

Для зарегистрированных: Вот с зарегистрированными пользователями я провозился очень долго, пока на форуме Joomla пользователь под ником Poznakomlus, не подсказал мне, что в фигурных скобках идут поля для зарегистрированных пользователей, тут-то до меня все и дошло. Дело в том, что при добавлении комментария от зарегистрированного пользователя, все поля кроме текста комментария, берутся из базы данных, а именно из таблицы #_users. Получается, даже если бы мы добавили чекбокс для зарегистрированных пользователей, он бы не отправлялся. Вот поэтому мы добавили поле antibot с изначальным значением  «1», в таблицу #_users. А так же добавили строчку для передачи значения этого поля в таблицу #_k2_comments, вместе с имеем пользователя и почтовым ящиком.

 

Фууух… Ну вот и все, надеюсь я все доступно разжевал и вы поняли, как работает капча. Я уже месяц использую её на своем блоге и за месяц, у меня ни одного спамерского комментария. Данная капча, на мой взгляд, очень эффективна и надеюсь, вам она понравиться. Если вам что-то не понятно, то задавайте свои вопросы в комментариях к этому посту, ну или пишите через обратную связь (а если вам интересно как сделать обратную связь на Joomla, тогда прочитайте статью здесь). Да и вообще напишите свое мнение о моей переделке.

 

На десерт приготовил угарное видео про гаишника, которого развели два парня, хотя если честно, то повелся он сам =) Просматривая это видео, я вот представил себе ситуацию, еду я на авто, у тут на улице гаишник такое вытворяет =)

 

Спасибо за внимание!!! С уважением Остапенко Илья.

Оцените материал
(2 голосов)
 

Комментарии   

 
Андрей
+1 # Андрей 05.02.2013 21:59
Мне Антиспами БИ хватает пока :-)
Ответить | Ответить с цитатой | Цитировать
 
 
Даша
+1 # 11.04.2013 07:32
ох, с кодом я разобралась, а вот таблицы - это дааа... :-*
у меня сайт на хосте, но для начала решила поэкспериментир овать а локалке, влезла в phpmyAdmin, нашла нужные таблицы, нажала кнопку Вставить, а таааам.... куча полей: id, userID, userName, gender и так далее... вот ума не приложу, куда писать значение, тип... а "по умолчанию" - это тоже поле? )))
я очень извиняюсь за глупые вопросы, но так устала уже отбиваться от спамеров, а разные замысловатые капчи, предлагаемые плагинами, меня сильно нервируют (боюсь, что и комментаторов тоже), поэтому очень обрадовалась найдя вашу статью... вот бы еще реализовать ее на практике!
Помогите, пожалуйста!!! век не забуду ))))
Ответить | Ответить с цитатой | Цитировать
 
 
Остапенко Илья
+2 # Остапенко Илья 11.04.2013 08:59
Здравствуйте, Дарья. Если есть возможность, давайте свяжемся в скайпе, по голосовой связи, и я вам все подробно объясню. Просто так будет быстрее и проще, Вам все объяснить.
Ответить | Ответить с цитатой | Цитировать
 
 
Алексей
0 # Алексей 29.05.2013 09:32
А почему спамбот не сможет поставить галочку?
Ответить | Ответить с цитатой | Цитировать
 
 
Остапенко Илья
0 # Остапенко Илья 30.05.2013 15:31
Может, но не стандартные скрипты. Для подобного случая придеться писать отдельный скрипт.
Ответить | Ответить с цитатой | Цитировать
 
 
Сергей
0 # 28.08.2013 15:39
Спасибо большое. Сделал для своего нового сайта, все получилось ;-)
Ответить | Ответить с цитатой | Цитировать
 
 
organism
0 # 24.09.2013 15:53
мда.... сделал все по инструкции, но никакой галочки не увидел :o
Ответить | Ответить с цитатой | Цитировать
 
 
 
 
AzaLeo
0 # AzaLeo 19.11.2013 13:59
Издеваетесь? Робот когда постит спам заполнеяет все поля и кликает на все чекбоксы/радиок нопки. Сейчас нет ничего лучше, кроме как логического вопроса. Но не всегда его удается вставить в кривые компоненты.
Ответить | Ответить с цитатой | Цитировать
 
 
Остапенко Илья
0 # Остапенко Илья 20.11.2013 17:30
Ну когда я использовал комментарии от К2 со своей капчей, спам исчез. У других людей тоже. Дело то ваше, не нравиться не пользуйтесь.
Ответить | Ответить с цитатой | Цитировать
 
 
Николай
0 # 28.11.2013 11:40
Ну где здесь чекбокс? Я спокойно без всякой проверкм комментарий отправил.
Ответить | Ответить с цитатой | Цитировать
 
 
Остапенко Илья
0 # Остапенко Илья 28.11.2013 16:36
Наверно потому что сейчас используется компонент JComments, а не стандартный К2.
Ответить | Ответить с цитатой | Цитировать
 
 
Андрей
0 # Андрей 27.12.2013 03:00
Чек бокс появился, визуально все нормально. Но комментарий уходит и без галочки в чек боксе. Короче не воспринимает его как обязательное к заполнению. Есть идеи? Спасибо
Ответить | Ответить с цитатой | Цитировать
 
 
Андрей
0 # Андрей 27.12.2013 03:17
Все разобрался, моя ошибка была )) спасибо за урок, реально помогло
Ответить | Ответить с цитатой | Цитировать
 
 
Антон
0 # 10.01.2014 18:27
Можно доработать этот способ.
Добавить еще один чечбокс, не видимый(скрыть средствами CSS)
если спам-бот и будет заполнять чечбоксы, то он заполнит оба. А человек будет видеть только один :-)
Ответить | Ответить с цитатой | Цитировать
 
 
Антон
0 # 10.01.2014 18:28
Самого достал спам. Поддерживаю довольно крупный проект. За неделю с reCaptcha!!!!! приходит порядка 100 сообщений
Ответить | Ответить с цитатой | Цитировать
 
 
Остапенко Илья
0 # Остапенко Илья 11.01.2014 14:05
Да, вариант хороший.
Ответить | Ответить с цитатой | Цитировать
 
Добавить комментарий


Защитный код
Обновить