Перейти к содержанию
Официальный форум поддержки Simpla

Спам в комментариях блога


Рекомендуемые сообщения

В блоге начали появляться спамные комментарии. Самое интересное, я не могу понять как они туда попадают? Комментарии на английском, я в BlogView.php сделал проверку на то, что если в тексте комментария нет хоть одной русской буквы, то вылезает ошибка и комментарий не добавляется. На форме все работает отлично, тем не менее, комментарии проходят!

Такое ощущение, что есть где то ещё какой то скрипт, через который происходит добавление комментариев?

 

Да, нашел... это мой доп.код был.

 

Но все равно, у многих лезет спам! Что бы как то защититься я сделал следующее:

1. Добавил скрытое текстовое поле "phone" на форму, заполнить которую может только робот. В случае если поле заполнено, то ругаюсь ошибкой на не верную капчу.

2. Сделал проверку preg_match("/[а-яА-ЯёЁ]+/u", $xxx) на имя автора комментария и текст комментария. Если в этих двух полях нет хотя бы одной русской буквы, то будет ошибка. Владельца магазина это устраивает, ибо иностранных комментариев у него нет и не нужны :)

 

Идеи:

Убрать капчу и заменить ее какой то своей наработкой, пусть даже более простой, но не массовой как капча симплы, что бы только лишь ради одного магазина не стали писать робота,

Ссылка на сообщение
Поделиться на другие сайты

Ваше решение помогло избавиться от спама ? Не могли бы вы пошагово расписать, как реализовать эти два пункта у себя. Спасибо

Ссылка на сообщение
Поделиться на другие сайты

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');
}		

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

 

ЭТО пример только для комментарий к товарам!!! По аналогичному сценарию все тоже самое необходимо проделать для комментарий к записям блога, туда спам тоже лезет.

 

В магазине одного заказчика я реализовал сразу оба этих способа, больше спама не было. Возможно будет достаточно только первого способа со скрытым полем.

Ссылка на сообщение
Поделиться на другие сайты
  • 3 месяца спустя...
  • 6 месяцев спустя...
  • 2 года спустя...

Благодарю! Наконец-то избавился от спама в комментариях, под 150 в день было..  :) Первого метода мне оказалось абсолютно достаточно

Изменено пользователем xavior
Ссылка на сообщение
Поделиться на другие сайты
  • 1 год спустя...

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

Ссылка на сообщение
Поделиться на другие сайты
  • 1 месяц спустя...

Первый способ работает на УРА на страницах с комментариями, а вот на странице фидбека никак не получается прикрутить.
Подскажите, пожалуйста, куда копать

 

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;
	}
}
Ссылка на сообщение
Поделиться на другие сайты

Первый способ работает на УРА на страницах с комментариями, а вот на странице фидбека никак не получается прикрутить.

Подскажите, пожалуйста, куда копать

Полностью по аналогии. Если не выходит, то просить специалистов за денежку...
Ссылка на сообщение
Поделиться на другие сайты
  • 3 недели спустя...

Спасибо за решение! Только что сделал сам ручками :) Аж приятно. Просто шел по инструкции написанной автором. При много благодарен!

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...