Перейти к контенту

Защита от ботов


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

вишь Valera, уже некоторые отпали))))

 

А чем 'обычный' ( Продвинутый код безопасности 3.1 ) не устраивает? Роботы еще его долгое время не сломают))

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

  • Ответы 78
  • Создана
  • Последний ответ

Лучшие авторы в этой теме

Лучшие авторы в этой теме

---------

а что на этом рисунке надо складывать то?)

---------

 

не совсем складывать,

там надо вычислить значение икс,

т.е. 70-5^2-6^2

 

--------------

Роботы еще его долгое время не сломают))

--------------

Я хочу блокировать не только ботов, но и школьников (которые например не умеют считать, что-то типа даун контроля).

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

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

а, как я уже неоднократно говорил, предложи разложить экспоненту в степени икс по формуле Тэйлора.. или синус, или косинус по этим формулам)

Это не подойдет, так как ДАЖЕ(!!!) не каждый выпускник вуза, спустя лет 5 и более вспомнит даже закон ома(который проходят по школьной программе). :D Для вычисления в уме (за определенный промежуток времени), имхо это не подходит... ;)

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

я шучу)

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

в общем, много глупостей приходит в голову

самое эффективное - пример, да еще и лишние цифры на картинке, чтоб бот их учитывал, а человек- нет

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

самое эффективное - пример, да еще и лишние цифры на картинке, чтоб бот их учитывал, а человек- нет

 

Не-а, самое эффективное (от бота), это имхо, разрезание произвольной картинки на произвольные фрагменты, потом при помощи драг энд дропа надо картинку воссоздать... Картинки должны быть рандомными и переодически обновляться, разрезы тоже дожны быть рандомными (те срезы под различными углами).

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

Самая простая реализация подобного алгоритма,

имеем некий каталог с картинками,

скрипт рандомно открывает любой файл(картинку),

делит ее, скажем, на 20 прямоугольных областей,

данные области записывает в массив который "перемешивается" и выводит пользователю картинку с перемешанными областями,

рядом с картинкой с перемешанными областями, есть пустая картинка,

куда при помощи кликов с одной картинки на другую переносятся области по координатам клика...

Если картинка не "собралась" или собралась не правильно, => выводится другая картинка, либо такой айпишник вносится во временный бан, например на сутки... и т.д. :D

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

  • 5 недель спустя...

Только благодаря автору мода

Активация путём ответа на вопросы

я прикрутил такие вопросы к регистрации

в дальнейшем говорим спасибо Sannis

сейчас в этой теме я постараюсь оформить инструкцию, а потом выложу в файловый архив

 

Итак, начнем

 

1. Выполнить запрос

CREATE TABLE ibf_questions (
id mediumint(8) NOT NULL AUTO_INCREMENT, 
question text NOT NULL default '', 
answer text NOT NULL, 
PRIMARY KEY  (id)
);

 

2. в папке sources/action_admin/ ДОБАВИТЬ файл следующего названия и содержания:

questions.php

<?php

/*
+--------------------------------------------------------------------------
|   Invision Power Board 2.1.7
|   =============================================
|   by Matthew Mecham
|   (c) 2001 - 2005 Invision Power Services, Inc.
|   http://www.invisionpower.com
|   =============================================
|   Web: http://www.invisionboard.com
|		http://www.ibresource.ru/products/invisionpowerboard/
|   Time: Tuesday 06th of February 2007 06:30:41 PM
|   Release: ac9f31b6733e1bf5b59de50f412872a4
|   Licence Info: http://www.invisionboard.com/?license
|				 http://www.ibresource.ru/license
+---------------------------------------------------------------------------
|   INVISION POWER BOARD IS NOT FREE / OPEN SOURCE!
+---------------------------------------------------------------------------
|   INVISION POWER BOARD НЕ ЯВЛЯЕТСЯ БЕСПЛАТНЫМ ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ!
|   Права на ПО принадлежат Invision Power Services
|   Права на перевод IBResource (http://www.ibresource.ru)
+---------------------------------------------------------------------------
|   > $Date: 2005-10-10 14:08:54 +0100 (Mon, 10 Oct 2005) $
|   > $Revision: 23 $
|   > $Author: matt $
+---------------------------------------------------------------------------
|
|   > Help Control functions
|   > Module written by Matt Mecham
|   > Date started: 2nd April 2002
|
|	> Module Version Number: 1.0.0
|   > DBA Checked: Mon 24th May 2004
+--------------------------------------------------------------------------
|   Questions Mod v1.0
|   =============================================
|   > $Date: 2007-02-21 20:00 +0300 (Wed, 21 Feb 2007) $
|   > $Author: Sannis (http://sannis.ru) , altered by Arhar $
+---------------------------------------------------------------------------
*/

if ( ! defined( 'IN_ACP' ) )
{
print "<h1>Неверный вход</h1> У Вас нет доступа к директиве этого файла. Если Вы проводили обновления, убедитесь, что не забыли обновить 'admin.php'.";
exit();
}


class ad_questions
{
function auto_run()
{
	//-----------------------------------------
	// Kill globals - globals bad, Homer good.
	//-----------------------------------------

	$tmp_in = array_merge( $_GET, $_POST, $_COOKIE );

	foreach ( $tmp_in as $k => $v )
	{
		unset($$k);
	}

	//-----------------------------------------

	switch($this->ipsclass->input['code'])
	{
		case 'edit':
			$this->show_form('edit');
			break;
		case 'new':
			$this->show_form('new');
			break;

		case 'doedit':
			$this->doedit();
			break;

		case 'donew':
			$this->doadd();
			break;

		case 'remove':
			$this->remove();
			break;

		//-----------------------------------------
		default:
			$this->list_files();
			break;
	}

}

//-----------------------------------------
// Questions FUNCTIONS
//-----------------------------------------

function doedit()
{
	if ($this->ipsclass->input['id'] == "")
	{
		$this->ipsclass->admin->error("Вы должны ввести правильный ID вопроса!");
	}

	$question  = preg_replace( "/\n/", "<br>", stripslashes($_POST['question'] ) );
	$answer  = preg_replace( "/\n/", "<br>", stripslashes($_POST['answer'] ) );

	$text  = preg_replace( "/\\\/", "& #092;", $text );

	$this->ipsclass->DB->do_update( 'questions', array( 'question'	   => $question,
												  'answer'		=> $answer,
										  ), "id=".intval($this->ipsclass->input['id'])	 );

	$this->ipsclass->admin->save_log("Изменен вопрос для модуля Questions");

	$this->ipsclass->boink_it($this->ipsclass->base_url."& amp;{$this->ipsclass->form_code}");
	exit();


}

//=====================================================


function show_form($type='new')
{
	$this->ipsclass->admin->page_detail = "В этой секции вы можете добавлять, изменять и удалять вопросы для модуля Questions.";
	$this->ipsclass->admin->page_title  = "Управление вопросами для активации";

	//-----------------------------------------

	if ($type != 'new')
	{

		if ($this->ipsclass->input['id'] == "")
		{
			$this->ipsclass->admin->error("Вы должны ввести правильный ID вопроса!");
		}

		//-----------------------------------------

		$this->ipsclass->DB->simple_construct( array( 'select' => '*', 'from' => 'questions', 'where' => "id=".intval($this->ipsclass->input['id']) ) );
		$this->ipsclass->DB->simple_exec();

		if ( ! $r = $this->ipsclass->DB->fetch_row() )
		{
			$this->ipsclass->admin->error("Невозможно найти в базе данных вопрос с таким ID");
		}

		//-----------------------------------------

		$button = 'Изменить этот вопрос';
		$code   = 'doedit';
	}
	else
	{
		$r = array();
		$button = 'Добавить этот вопрос';
		$code   = 'donew';
	}

	$this->ipsclass->html .= $this->ipsclass->adskin->start_form( array( 1 => array( 'code'  , $code ),
																		 2 => array( 'act'   , 'questions'	 ),
																		 3 => array( 'id'	, $this->ipsclass->input['id'] ),
																		 4 => array( 'section', $this->ipsclass->section_code ),
																)	  );



	$this->ipsclass->adskin->td_header[] = array( " "  , "20%" );
	$this->ipsclass->adskin->td_header[] = array( " "  , "80%" );

	$r['question'] = preg_replace( "/<br>/i", "\n", stripslashes($r['question']) );

	 //-----------------------------------------

	$this->ipsclass->html .= $this->ipsclass->adskin->start_table( $button );

	$this->ipsclass->html .= $this->ipsclass->adskin->add_td_row( array( "Вопрос",
											  $this->ipsclass->adskin->form_textarea('question', stripslashes($r['question']) ),
									 )	  );

	$this->ipsclass->html .= $this->ipsclass->adskin->add_td_row( array( "Ответ",
											  $this->ipsclass->adskin->form_input('answer'  , stripslashes($r['answer']) ),
									 )	  );

	$this->ipsclass->html .= $this->ipsclass->adskin->end_form($button);

	$this->ipsclass->html .= $this->ipsclass->adskin->end_table();

	$this->ipsclass->admin->output();

}

//=====================================================

function remove()
{
	if ($this->ipsclass->input['id'] == "")
	{
		$this->ipsclass->admin->error("Вы должны ввести правильный ID вопроса!");
	}

	$this->ipsclass->DB->simple_exec_query( array( 'delete' => 'questions', 'where' => "id=".$this->ipsclass->input['id'] ) );

	$this->ipsclass->admin->save_log("Удалён вопрос для модуля Questions");

	$this->ipsclass->boink_it($this->ipsclass->base_url."& amp;{$this->ipsclass->form_code}");
	exit();


}

//=====================================================

function doadd()
{
	if (($this->ipsclass->input['question'] == "") || ($this->ipsclass->input['answer'] == ""))
	{
		$this->ipsclass->admin->error("Вы должны ввести вопрос и ответ!");
	}

	$question  = preg_replace( "/\n/", "<br>", stripslashes($_POST['question'] ) );
	$answer = preg_replace( "/\n/", "<br>", stripslashes($_POST['answer'] ) );

	$question  = preg_replace( "/\\\/", "& #092;", $question );
	$answer  = preg_replace( "/\\\/", "& #092;", $answer );

	$this->ipsclass->DB->do_insert( 'questions', array( 'question'	   => $question,
								  'answer'		=> $answer,
						 )	  );

	$this->ipsclass->admin->save_log("Добавлен вопрос для модуля Questions");

	$this->ipsclass->boink_it($this->ipsclass->base_url."& amp;{$this->ipsclass->form_code}");
	exit();	
}

//=====================================================

function list_files()
{
	$this->ipsclass->admin->page_detail = "В этой секции вы можете добавлять, изменять и удалять вопросы для модуля Questions";
	$this->ipsclass->admin->page_title  = "Управление вопросами для модуля Questions";

	//-----------------------------------------

	$this->ipsclass->adskin->td_header[] = array( "Вопрос"  , "50%" );
	$this->ipsclass->adskin->td_header[] = array( "Ответ"  , "20%" );
	$this->ipsclass->adskin->td_header[] = array( "Изменить"   , "15%" );
	$this->ipsclass->adskin->td_header[] = array( "Удалить" , "15%" );

	//-----------------------------------------

	$this->ipsclass->html .= $this->ipsclass->adskin->start_table( "Текущие вопросы" );

	$this->ipsclass->DB->simple_construct( array( 'select' => '*', 'from' => 'questions', 'order' => "id" ) );
	$this->ipsclass->DB->simple_exec();

	if ( $this->ipsclass->DB->get_num_rows() )
	{
		while ( $r = $this->ipsclass->DB->fetch_row() )
		{

			$this->ipsclass->html .= $this->ipsclass->adskin->add_td_row( array( stripslashes($r['question']),//"<b>".stripslashes($r['question'])."</b>"),
													  stripslashes($r['answer']),
													  "<center><a href='".$this->ipsclass->base_url."& amp;{$this->ipsclass->form_code}& amp;code=edit& amp;id={$r['id']}'>Изменить</a></center>",
													  "<center><a href='".$this->ipsclass->base_url."& amp;{$this->ipsclass->form_code}& amp;code=remove& amp;id={$r['id']}'>Удалить</a></center>",
											 )	  );



		}
	}

	$this->ipsclass->html .= $this->ipsclass->adskin->add_td_basic("<a href='".$this->ipsclass->base_url."& amp;{$this->ipsclass->form_code}& amp;code=new'>Добавить новый вопрос</a>", "center", "pformstrip" );

	$this->ipsclass->html .= $this->ipsclass->adskin->end_table();

	//-----------------------------------------

	$this->ipsclass->admin->output();
}


}


?>

найти три раза & #092; и написать слитно

найти 11 раз & amp; и написать слитно

 

3. изменение файла /sources/acp_loaders/acp_admin.php

найти

								'components'=> 'components',
							'acpperms'  => 'acppermissions',
							'security'  => 'security',

добавить после:

								'questions' => 'questions',

 

4. изменение файла /sources/acp_loaders/acp_pages_admin.php

найти

					6 => array( 'Журнал предупреждений'	   , 'section=admin& amp;act=warnlog'   ),
			   );

добавить после

$CATS[]  = array( 'Модуль вопросов' );

$PAGES[] = array(
				1 => array( 'Вопросы при регистрации'	   , 'section=admin& amp;act=questions'   ),
			   );

опять таки & amp; пишется слитно

 

5. идем в настройки - настройки безопасности и добавляем следующую настройку:

Название настройки: Правильные ответы

 

Описание настройки: Количество правильных ответов, необходимых для успешного завершения регистрации

 

Группа настройки: Настройки Безопасности

 

Тип настройки: Ввод текста (одна строка)

 

Ключ настройки: questions_num

 

Текущее значение настройки: 1

 

Значение настройки по умолчанию? 0

 

Начать группу настроек: Модуль вопросов

 

Закончить группу настроек? Да

 

Добавить эту настройку в кеш настроек? Да

не указанные поля изменять не надо

 

6. изменение файла cache/lange_cache/*/lang_register.php

найти

$lang = array (

добавить после

//antispam.question
'err_reg_question'		 => "Не дано достаточное количество правильных ответов на защитные вопросы. Повторите попытку.",

 

7. идем во внешний вид - изменить html фрагменты - skin_register - ShowForm

ищем

<!--{REQUIRED.FIELDS}-->

добавляем после

<fieldset class="row3">
<legend><b>Защитные вопросы</b></legend>
<!--{ANTISPAM.QUESTION}-->
</fieldset>

 

8. создаем в skin_register новый фрагмент

имя - question_row

входящие переменные - $row

содержание -

<tr>
<td width="80%">{$row['question']}</td>
<td width="20%" align="center">{$row['answer_input']}</td>
</tr>

 

9. ну и наконец sources/action_public/register.php

найти

	var $modules	= "";

добавить после

	//antispam.question
var $prefix	   = "answer_";

найти

		//-----------------------------------------
	// Replace elements
	//-----------------------------------------

добавить после

		//antispam.question
	$question_row .= "<table class='ipbtable' cellspacing=\"0\">
						<tr>
							<td width=\"100%\" colspan=\"2\">Для успешной регистрации необходимо ответить на ".$this->ipsclass->vars['questions_num']." вопрос(ов)</td>
						</tr>
	";
	$this->ipsclass->DB->simple_construct( array( 'select' => 'id, question',
								   'from'   => 'questions',
								   'order'  => 'id'
						  )	  );
	 $this->ipsclass->DB->simple_exec();

	  while ($row = $this->ipsclass->DB->fetch_row() )
	 {
		 $row['answer_input'] = "<input type=\"text\" maxlength=\"60\" size=\"30\" name=\"".$this->prefix.$row['id']."\" />";
		$question_row .= $this->ipsclass->compiled_templates['skin_register']->question_row( $row );
	}
	$question_row .="</table>";

	$this->output = str_replace( "<!--{ANTISPAM.QUESTION}-->", $question_row , $this->output );
	//antispam.question

найти

		//-----------------------------------------
	// CHECK 2: Any errors (duplicate names, etc)?
	//-----------------------------------------

	if ( count( $form_errors ) )
	{
		$this->show_reg_form( $form_errors );
		return;
	}

добавить ПЕРЕД

		//antispam.question
	$n = $this->num_correct();
	if(!$this->correct_answer($n))
	{
		$form_errors['general'][] = $this->ipsclass->lang['err_reg_question'];
	}
	//antispam.question

найти

}

?>

добавить ПЕРЕД

	/*-------------------------------------------------------------------------*/
	// Calculate correct answers
	/*-------------------------------------------------------------------------*/

	function num_correct()
	{ 		
		$this->ipsclass->DB->simple_construct( array( 'select' => 'id, answer',
									  'from'   => 'questions',
									  'order'  => 'id'
							 )	  );
		$this->ipsclass->DB->simple_exec();

		$n = 0;

		while ($row = $this->ipsclass->DB->fetch_row() )
		{
			$s = $this->prefix.$row['id'];
			if(isset($this->ipsclass->input[$s]) && $this->ipsclass->input[$s] == $row['answer'])
			{
				$n++; 			
			}
		}

	return $n;
	}

	/*-------------------------------------------------------------------------*/
	// Correct?
	/*-------------------------------------------------------------------------*/

	function correct_answer($n)
	{
		if($n >= $this->ipsclass->vars['questions_num'])
			return true;
		else
			return false;
	}

 

усе..работает

в моды

 

для успешной работы необходимо придумать хотя бы один вопрос и ответ на него

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

Offtopic: Даже и не думал о таком применении)
Ссылка на комментарий
Поделиться на других сайтах

надо создать топик "Защита от ботов" и выложить туда ссылки на все нестандартные решения. И самое главное - закрыть его.

Думаю такой топик будет пользоваться популярностью.

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

  • 1 месяц спустя...
Кстати на самом деле.. Ввёл поле имя и сделал нестандартное имя с обязательным заполнением поля..
Ссылка на комментарий
Поделиться на других сайтах

а нифига

бот не заполняет стандартные поля, он заполняет все, что есть в форме под тегом input

ну естесственно продвинутый бот...

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

  • 1 месяц спустя...

Топ умер?

Если данная дискуссия ещё актуальная - могу предложить один эффективный вариант решения проблемы с ботами.

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

Тут вы обсуждали всевозможные методы по борьбе с ботами. Вот у меня возникла идея системы, которая остановит ботов ещё на лет 10 :D

 

Вот накидал макет в delphi

http://img247.imageshack.us/img247/7531/activationsn5.jpg

 

Значит так, по пунктам:

  1. Юзер загружает текстовик
    Скрипт проверяет если размер текстовика = 0 байт - значит шаг пройден.
  2. Логин через +
    Можно в принципе выбрать любой другой знак, мне этот понравился ;)
    Можно узнать длину логина (lenght), присвоить переменной N (допустим) количество символов в логине, через for заполнить "+" после каждой буквы N-1 раз.
  3. Цифры в обратном порядке
    Я предлагаю сделать 3 массива. 1 массив "A" генерирует случайное число и выводится юзеру для обработки. К массиву "B" присваиваем значения (числа) массив "А", массив "B" переворачиваем, для сравнения конечного результата. Юзер заполняет форму (массив "С"), в результате сравниваем массив "С" (вариант юзер) и массив "B" (вариант скрипта).
  4. Числа, которые делятся на 2
    Ну это думаю ход моих мыслей объяснять не нужно :)
  5. Картинка
    На сей алгоритм картинки натолкнула модификация Продвинутый код безопасности 3.1 , за что автору отдельное спасибо.
  6. Перенос строки из одной формы в другую
    Выводится одна строка, которая либо одна, либо выбирается из списка, который можно сделать в админке. Дальше юзер переносит строку в форму2 с формы1. Проверка:
    Сравниваем значение формы2 с строкой, которая была дана юзеру (можно сравнивать по MD5 коды), или по другому. Кому как угодно. И проверяем пуста ли форма1 (if length = 0).
  7. Дата рождения
    Тут думаю тоже объяснять ничего не нужно.
  8. Обычный вопрос к юзеру
    Естественно, правильное значение 1 из 3. Вопросы и ответы можно использовать одни, либо задавать через админцентр, то есть каждый раз новые вопросы и ответы.
  9. Перетаскивание бегунка
    Устанавливаем минимальное и максимальное значение, раз у нас проценты - значит:
    min := 0;
    max := 100;
    Здесь думаю желаемую позицию (я выбрал 54%) можно оставить единственной, а вот позицию бегунка можно сделать случайной. И в конце сравниваем позиции.

Как мне кажется, если сделать такую систему - это на долго остановит ботов. Очень на долго.

Реализация, как мне кажется, не простая. Сам бы написал, если бы знал php так, как знаю delphi :) Но не судьба мне быть автором сего творения.

 

Жду мнений. :)

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

а также она остановит пользователей)) навсегда)))

шучу

9 пункт наверно отпадает сразу, ибо я в html не знаю бегунки есть ли вообще

1 ячейка - отпугнет юзеров 100% ибо у меня 7/8 даже не знают, что такое ксс и зачем надо в настройках выбрать "кешировать ксс"

остальное так или иначе реализовано (или легко реализуемо на основе имеющегося, например 3,4,6 - через вопросы (4 с небольшим изменением), 2,7,8 - я видел такие запросы, достаточно всего 5 строчек кода в регистер пхп для реализации каждого, 5 - капча Гаррета), достаточно всего-лишь установить это все сразу

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

Жду мнений. :D

Зачем такие сложности?

У меня во всех разделах разрешено писать и создавать темы гостям; никаких цифр или плюсиков для идентификации вводить не надо: написал и жми кнопку "отправить".

Элементарная проверка джава-скриптом, нажимались ли клавиши клавиатуры и щелкалась ли мышкой - боты этого делать не умеют и не будут уметь делать.

Детали описывать не буду: пока алгоритм уникальный, ботописателям нет смысла взламывать мой алгоритм ради одного форума.

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

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

Гость
Эта тема закрыта для публикации сообщений.

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.