Jump to content

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


Recommended Posts

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

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

 

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

 

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

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

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

 

Идеи:

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

Link to post
Share on other sites

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

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

 

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

 

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

Link to post
Share on other sites
  • 3 months later...
  • 6 months later...
  • 2 years later...

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

Edited by xavior
Link to post
Share on other sites
  • 1 year later...

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

Link to post
Share on other sites
  • 1 month later...

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

 

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;
	}
}
Link to post
Share on other sites

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

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

Полностью по аналогии. Если не выходит, то просить специалистов за денежку...
Link to post
Share on other sites
  • 3 weeks later...

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

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...