Gloobus Posted August 24, 2014 Report Share Posted August 24, 2014 В блоге начали появляться спамные комментарии. Самое интересное, я не могу понять как они туда попадают? Комментарии на английском, я в BlogView.php сделал проверку на то, что если в тексте комментария нет хоть одной русской буквы, то вылезает ошибка и комментарий не добавляется. На форме все работает отлично, тем не менее, комментарии проходят!Такое ощущение, что есть где то ещё какой то скрипт, через который происходит добавление комментариев? Да, нашел... это мой доп.код был. Но все равно, у многих лезет спам! Что бы как то защититься я сделал следующее:1. Добавил скрытое текстовое поле "phone" на форму, заполнить которую может только робот. В случае если поле заполнено, то ругаюсь ошибкой на не верную капчу.2. Сделал проверку preg_match("/[а-яА-ЯёЁ]+/u", $xxx) на имя автора комментария и текст комментария. Если в этих двух полях нет хотя бы одной русской буквы, то будет ошибка. Владельца магазина это устраивает, ибо иностранных комментариев у него нет и не нужны Идеи:Убрать капчу и заменить ее какой то своей наработкой, пусть даже более простой, но не массовой как капча симплы, что бы только лишь ради одного магазина не стали писать робота, Quote Link to post Share on other sites
root Posted August 30, 2014 Report Share Posted August 30, 2014 Ваше решение помогло избавиться от спама ? Не могли бы вы пошагово расписать, как реализовать эти два пункта у себя. Спасибо Quote Link to post Share on other sites
Gloobus Posted September 3, 2014 Author Report Share Posted September 3, 2014 root,Да, мне это помогло Добавление скрытого поля в форму комментарияИ так, для начала попробуем добавить скрытое поле в форму комментария. Пользователь его видеть не будет, следовательно не заполнит, а робот будет пытаться заполнить все, что видит в <form>1. Открываем design/ваш_шаблон/html/product.tpl и добавляем куда нибудь внутри <form class="comment_form" method="post"> ... </form> следующее поле: <input class="input_phone" type="text" id="comment_phone" name="phone" value="{$comment_phone|escape}"/> 2. Открываем design/ваш_шаблон/css/style.css и куда нибудь в конец добавляем: #comment_phone {visibility:hidden; height:1px; width:1px} 3. Открываем view/ProductView.php и после $captcha_code = $this->request->post('captcha_code', 'string'); вставляем это: $anti_bot = $this->request->post('phone'); Чуть ниже, после $this->design->assign('comment_name', $comment->name); добавляем строку: $this->design->assign('comment_phone', $anti_bot); Еще чуть ниже, после проверки elseif (empty($comment->name)) { $this->design->assign('error', 'empty_name'); } добавляем проверку на заполнение данного скрытого поля elseif (!empty($anti_bot)) { $this->design->assign('error', 'captcha'); } В итоге мы получаем... Если данное скрытое поле было заполнено - это робот! Не производим добавление комментария и возвращается ошибка о неверно введеной капче Проверка имени и текста комментария на содержания в них хотя бы одного кириллического символаЕсли вам не нужны комментарии полностью на иностранных языках или в транслите, то этот способ тоже имеет место быть1. Открываем design/ваш_шаблон/html/product.tpl и после {elseif $error=='empty_comment'} Введите комментарий добавляем: {elseif $error=='non_russian_name'}Имя должно быть на русском языке {elseif $error=='non_russian_text'} Комментарий должен содержать русские слова2. Открываем view/ProductView.php и после. elseif (empty($comment->name)) { $this->design->assign('error', 'empty_name'); } вставляем проверку: elseif (!preg_match("/[а-яА-ЯёЁ]+/u", $comment->name)) { $this->design->assign('error', 'non_russian_name'); } Еще чуть ниже после elseif (empty($comment->text)) { $this->design->assign('error', 'empty_comment'); } добавляем: elseif (!preg_match("/[а-яА-ЯёЁ]+/u", $comment->text)) { $this->design->assign('error', 'non_russian_text'); } Все, теперь у нас при попытке добавить комментарий, где в имени и тексте комментария нет хотя бы одной буквы кириллического алфавита, будет выводиться соответсвующая ошибка. ЭТО пример только для комментарий к товарам!!! По аналогичному сценарию все тоже самое необходимо проделать для комментарий к записям блога, туда спам тоже лезет. В магазине одного заказчика я реализовал сразу оба этих способа, больше спама не было. Возможно будет достаточно только первого способа со скрытым полем. Quote Link to post Share on other sites
daramal Posted December 18, 2014 Report Share Posted December 18, 2014 Спасибо большое! Отличное решение. Использовал 1-й вариант. Пока левых комментах не видать )) Quote Link to post Share on other sites
larenso Posted July 2, 2015 Report Share Posted July 2, 2015 Спасибо большое. Помогло ) Quote Link to post Share on other sites
xavior Posted August 1, 2017 Report Share Posted August 1, 2017 (edited) Благодарю! Наконец-то избавился от спама в комментариях, под 150 в день было.. Первого метода мне оказалось абсолютно достаточно Edited August 1, 2017 by xavior Quote Link to post Share on other sites
andreas81 Posted June 10, 2019 Report Share Posted June 10, 2019 Я считаю это хорошее решение проблемы. Наверное нужно колдовать с переменными и файлами чтоб поставить такую проверку на сообщения в обратной связи. Quote Link to post Share on other sites
jamaica Posted August 5, 2019 Report Share Posted August 5, 2019 Первый способ работает на УРА на страницах с комментариями, а вот на странице фидбека никак не получается прикрутить.Подскажите, пожалуйста, куда копать require_once('View.php'); class FeedbackView extends View { function fetch() { $feedback = new stdClass; if($this->request->method('post') && $this->request->post('feedback')) { $feedback->name = $this->request->post('name'); $feedback->email = $this->request->post('email'); $feedback->message = $this->request->post('message'); $anti_bot = $this->request->post('phone'); $this->design->assign('name', $feedback->name); $this->design->assign('email', $feedback->email); $this->design->assign('message', $feedback->message); $this->design->assign('comment_phone', $anti_bot); if(empty($feedback->name)) { $this->design->assign('error', 'empty_name'); } elseif(empty($feedback->email)) { $this->design->assign('error', 'empty_email'); } elseif(empty($feedback->message)) { $this->design->assign('error', 'empty_text'); } elseif (!empty($anti_bot)) { $this->design->assign('error', 'captcha'); } else { $this->design->assign('message_sent', true); $feedback->ip = $_SERVER['REMOTE_ADDR']; $feedback_id = $this->feedbacks->add_feedback($feedback); // Отправляем email $this->notify->email_feedback_admin($feedback_id); } } if($this->page) { $this->design->assign('meta_title', $this->page->meta_title); $this->design->assign('meta_keywords', $this->page->meta_keywords); $this->design->assign('meta_description', $this->page->meta_description); } $body = $this->design->fetch('feedback.tpl'); return $body; } } Quote Link to post Share on other sites
phukortsin Posted August 5, 2019 Report Share Posted August 5, 2019 Первый способ работает на УРА на страницах с комментариями, а вот на странице фидбека никак не получается прикрутить. Подскажите, пожалуйста, куда копатьПолностью по аналогии. Если не выходит, то просить специалистов за денежку... Quote Link to post Share on other sites
Russ Posted August 23, 2019 Report Share Posted August 23, 2019 Спасибо за решение! Только что сделал сам ручками Аж приятно. Просто шел по инструкции написанной автором. При много благодарен! Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.