Бан поисковых ботов на форуме phpBB3

Как забанить/запретить поискового бота или определённый браузер на форуме phpBB3

Небольшие моды и хаки для форума phpBB3
Правила форума
При размещении мода/статьи взятой с другого форума/сайта обязательно необходимо указывать первоисточник сообщения.
 • Просмотры: 3306
Аватара пользователя
PPK
Администратор
Благодарил (а): 82 раза
Поблагодарили: 1621 раз
Сообщения: 10284
Зарегистрирован: 21 мар 2009, 17:13
Сообщение

Бан поисковых ботов на форуме phpBB3

03 окт 2012, 14:24

В phpBB3 есть два способа (манипуляции на уровне сервера не рассматриваем) ограничить доступ бота к форуму:

а. С помощью файла robots.txt (как и для любого другого форума/сайта)
б. Добавить бота в адм. разделе и отключить права на просмотр/чтение форумов

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

1. В phpmyadmin выполнить (если префикс таблиц не phpbb_ - заменить на свой):

Код: Выделить всё

ALTER TABLE  `phpbb_bots` ADD  `bot_banned` TINYINT( 1 ) UNSIGNED NOT NULL DEFAULT  '0';

INSERT INTO `phpbb_config` (`config_name`, `config_value`, `is_dynamic`) VALUES ('bot_banned', '0', '0'), ('bot_banned_text', '', '0');
2. Переделать файлы:

adm/style/acp_bots.html после

Код: Выделить всё

	<dl>
		<dt><label for="bot_ip">{L_BOT_IP}:</label><br /><span>{L_BOT_IP_EXPLAIN}</span></dt>
		<dd><input name="bot_ip" type="text" id="bot_ip" value="{BOT_IP}" maxlength="255" /></dd>
	</dl>
добавить

Код: Выделить всё

	<dl>
		<dt><label for="bot_banned">{L_BOT_BANNED}:</label></dt>
		<dd><select id="bot_banned" name="bot_banned">{S_BANNED_OPTIONS}</select></dd>
	</dl>
после

Код: Выделить всё

		<th>{L_BOT_LAST_VISIT}</th>
		<th colspan="3">{L_OPTIONS}</th>
		<th>{L_MARK}</th>
добавить

Код: Выделить всё

		<th>{L_BOT_BANNED}&nbsp;[<a title="{L_SELECT_ALL}" href="#" onclick="$('.bot_ban').val(1);">+</a>/<a title="{L_UNSELECT_ALL}" href="#" onclick="$('.bot_ban').val(0);">-</a>]</th>
после

Код: Выделить всё

			<td style="text-align: center;">&nbsp;<a href="{bots.U_EDIT}">{L_EDIT}</a>&nbsp;</td>
			<td style="text-align: center;">&nbsp;<a href="{bots.U_DELETE}">{L_DELETE}</a>&nbsp;</td>
			<td style="text-align: center;"><input type="checkbox" class="radio" name="mark[]" value="{bots.BOT_ID}" /></td>
добавить

Код: Выделить всё

			<td style="text-align: center;"><select name="bot_banned[{bots.BOT_ID}]" class="bot_ban"><option value="1"<!-- IF bots.BOT_BANNED --> selected="selected"<!-- ENDIF --> />{L_YES}</option><option value="0"<!-- IF not bots.BOT_BANNED --> selected="selected"<!-- ENDIF --> />{L_NO}</option></select></td>
includes/acp/acp_board.php перед

Код: Выделить всё

						'legend2'				=> 'ACP_LOAD_SETTINGS',
						'load_birthdays'		=> array('lang' => 'YES_BIRTHDAYS',			'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true),
добавить

Код: Выделить всё

						'bot_banned'		=> array('lang' => 'BOT_BANNED',		'validate' => 'string',		'type' => 'text:1:1', 'explain' => true),
						'bot_banned_text'		=> array('lang' => 'BOT_BANNED_TEXT',		'validate' => 'string',		'type' => 'textarea:5:3', 'explain' => true),
includes/acp/acp_bots.php после

Код: Выделить всё

		$action = request_var('action', '');
		$submit = (isset($_POST['submit'])) ? true : false;
		$mark	= request_var('mark', array(0));
добавить

Код: Выделить всё

		$bot_banned	= request_var('bot_banned', array(0));
перед

Код: Выделить всё

			case 'delete':
				if ($bot_id || sizeof($mark))
				{
добавить

Код: Выделить всё

			case 'bot_banned':
				if (sizeof($bot_banned))
				{

					foreach($bot_banned as $k => $v)
					{
						$k=intval($k);
						$v=$v ? 1 : 0;
						$sql = 'UPDATE ' . BOTS_TABLE . "
							SET bot_banned = '{$v}'
							WHERE bot_id='{$k}'";
						$db->sql_query($sql);
					}
				}

				$cache->destroy('_bots');
			break;
после

Код: Выделить всё

					'bot_agent'		=> request_var('bot_agent', ''),
					'bot_ip'		=> request_var('bot_ip', ''),
					'bot_active'	=> request_var('bot_active', true),
добавить

Код: Выделить всё

					'bot_banned'	=> request_var('bot_banned', false),
после

Код: Выделить всё

								'user_id'		=> (int) $user_id,
								'bot_name'		=> (string) $bot_row['bot_name'],
								'bot_active'	=> (int) $bot_row['bot_active'],
добавить

Код: Выделить всё

								'bot_banned'	=> (int) $bot_row['bot_banned'],
после

Код: Выделить всё

							$sql = 'UPDATE ' . BOTS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', array(
								'bot_name'		=> (string) $bot_row['bot_name'],
								'bot_active'	=> (int) $bot_row['bot_active'],
добавить

Код: Выделить всё

								'bot_banned'	=> (int) $bot_row['bot_banned'],
после

Код: Выделить всё

				$_options = array('0' => 'NO', '1' => 'YES');
				foreach ($_options as $value => $lang)
				{
					$selected = ($bot_row['bot_active'] == $value) ? ' selected="selected"' : '';
					$s_active_options .= '<option value="' . $value . '"' . $selected . '>' . $user->lang[$lang] . '</option>';
				}
добавить

Код: Выделить всё

				$s_banned_options = '';
				$_options = array('0' => 'NO', '1' => 'YES');
				foreach ($_options as $value => $lang)
				{
					$selected = ($bot_row['bot_banned'] == $value) ? ' selected="selected"' : '';
					$s_banned_options .= '<option value="' . $value . '"' . $selected . '>' . $user->lang[$lang] . '</option>';
				}
после

Код: Выделить всё

					'BOT_AGENT'		=> $bot_row['bot_agent'],

					'S_EDIT_BOT'		=> true,
					'S_ACTIVE_OPTIONS'	=> $s_active_options,
добавить

Код: Выделить всё

					'S_BANNED_OPTIONS'	=> $s_banned_options,
заменить

Код: Выделить всё

		$_options = array('activate' => 'BOT_ACTIVATE', 'deactivate' => 'BOT_DEACTIVATE', 'delete' => 'DELETE');
на

Код: Выделить всё

		$_options = array('activate' => 'BOT_ACTIVATE', 'deactivate' => 'BOT_DEACTIVATE', 'delete' => 'DELETE', 'bot_banned' => 'BOT_BANNED');
заменить

Код: Выделить всё

		$sql = 'SELECT b.bot_id, b.bot_name, b.bot_active, u.user_lastvisit
на

Код: Выделить всё

		$sql = 'SELECT b.bot_id, b.bot_name, b.bot_active, b.bot_banned, u.user_lastvisit
перед

Код: Выделить всё

				'BOT_NAME'		=> $row['bot_name'],
				'BOT_ID'		=> $row['bot_id'],
				'LAST_VISIT'	=> ($row['user_lastvisit']) ? $user->format_date($row['user_lastvisit']) : $user->lang['BOT_NEVER'],
добавить

Код: Выделить всё

				'BOT_BANNED' => $row['bot_banned'] ? true : false,
includes/cache.php заменить (встречается 3 раза)

Код: Выделить всё

					$sql = 'SELECT user_id, bot_agent, bot_ip
на

Код: Выделить всё

					$sql = 'SELECT user_id, bot_agent, bot_ip, bot_banned, bot_id
заменить

Код: Выделить всё

				$bots[] = $row;
на

Код: Выделить всё

				$bots[$row['bot_id']] = $row;
includes/session.php заменить

Код: Выделить всё

	function session_begin($update_session_page = true)
	{
		global $phpEx, $SID, $_SID, $_EXTRA_URL, $db, $config, $phpbb_root_path;
на

Код: Выделить всё

	function session_begin($update_session_page = true)
	{
		global $phpEx, $SID, $_SID, $_EXTRA_URL, $db, $config, $phpbb_root_path, $cache;
после

Код: Выделить всё

		* bot, act accordingly
		*/
		$bot = false;
добавить

Код: Выделить всё

		$bot_id=0;
после

Код: Выделить всё

			if ($row['bot_agent'] && preg_match('#' . str_replace('\*', '.*?', preg_quote($row['bot_agent'], '#')) . '#i', $this->browser))
			{
				$bot = $row['user_id'];
добавить

Код: Выделить всё

				$bot_id=$row['bot_id'];
после

Код: Выделить всё

					if (strpos($this->ip, $bot_ip) === 0)
					{
						$bot = (int) $row['user_id'];
добавить

Код: Выделить всё

						$bot_id=$row['bot_id'];
перед

Код: Выделить всё

		// If our friend is a bot, we re-assign a previously assigned session
		if ($this->data['is_bot'] && $bot == $this->data['user_id'] && $this->data['session_id'])
добавить

Код: Выделить всё

		if($this->data['is_bot'] && $config['bot_banned'] && $bot_id && isset($active_bots[$bot_id]['bot_banned']) && $active_bots[$bot_id]['bot_banned'])
		{
			if(stristr($_SERVER['REQUEST_URI'], "ucp.{$phpEx}")===FALSE && $config['bot_banned']==1)
			{
				header("Location: ".append_sid("{$phpbb_root_path}ucp.{$phpEx}", 'mode=login'));
				exit();
			}
			else if($config['bot_banned']==2)
			{
				//$db->sql_query('DELETE FROM ' . SESSIONS_TABLE . ' WHERE session_user_id = ' . $this->data['user_id']);
				trigger_error($config['bot_banned_text'] ? $config['bot_banned_text'] : 'Sorry, this browser banned on forum.');
			}
		}
после

Код: Выделить всё

						$this->data['is_bot'] = (!$this->data['is_registered'] && $this->data['user_id'] != ANONYMOUS) ? true : false;
						$this->data['user_lang'] = basename($this->data['user_lang']);
добавить

Код: Выделить всё

						if($config['bot_banned']==2)
						{
							$bot = false;
							$bot_id=0;
							$active_bots = $cache->obtain_bots();

							foreach ($active_bots as $row)
							{
								if ($row['bot_agent'] && preg_match('#' . str_replace('\*', '.*?', preg_quote($row['bot_agent'], '#')) . '#i', $this->browser))
								{
									$bot = $row['user_id'];
									$bot_id=$row['bot_id'];
								}

								// If ip is supplied, we will make sure the ip is matching too...
								if ($row['bot_ip'] && ($bot || !$row['bot_agent']))
								{
									// Set bot to false, then we only have to set it to true if it is matching
									$bot = false;

									foreach (explode(',', $row['bot_ip']) as $bot_ip)
									{
										$bot_ip = trim($bot_ip);

										if (!$bot_ip)
										{
											continue;
										}

										if (strpos($this->ip, $bot_ip) === 0)
										{
											$bot = (int) $row['user_id'];
											$bot_id=$row['bot_id'];
											break;
										}
									}
								}

								if ($bot)
								{
									break;
								}
							}
							if($bot_id && isset($active_bots[$bot_id]['bot_banned']) && $active_bots[$bot_id]['bot_banned'])
							{
								//$db->sql_query('DELETE FROM ' . SESSIONS_TABLE . ' WHERE session_user_id = ' . $this->data['user_id']);
								trigger_error($config['bot_banned_text'] ? $config['bot_banned_text'] : 'Sorry, this browser banned on forum.');
							}
						}
language/ru/acp/board.php в самом конце перед
добавить

Код: Выделить всё

	'BOT_BANNED' => 'Бан ботов',
	'BOT_BANNED_EXPLAIN' => 'Включить бан поисковых ботов на форуме, 0 - отключить, 1 - включить частично (если пользователь определён как бот, для доступа необходимо будет войти на форум под своей учётной записью), 2 - включить полностью (все страницы форума будут недоступны)',
	'BOT_BANNED_TEXT' => 'Сообщение для забаненных ботов',
	'BOT_BANNED_TEXT_EXPLAIN' => ' Если число в предыдущей опции равно 2 - отображать указанный текст сообщения для бота (по молчанию будет отображаться сообщение: <em>Sorry, this browser banned on forum.</em>)',
language/ru/acp/bots.php в самом конце перед
добавить

Код: Выделить всё

	'BOT_BANNED' => 'Запретить',
	'SELECT_ALL' => 'Да',
	'UNSELECT_ALL' => 'Нет',
3. Очистить кеш, настроить опции (адм. раздел - вкладка Общие - Функции конференции), отметить ботов как забаненных (адм. раздел - вкладка Система - Поисковые боты - в колонке Запретить: выбрать нужных ботов, в форме справа снизу выбрать: Запретить - Отправить)

4. Если число в опции Бан ботов равно 1 - при определении бота как забаненного необходима очистка всех сессий на форуме (адм. раздел - вкладка Общие - Очистить все сессии) иначе, бан будет действовать только после истечения срока действия текущей сессии

5. Как уже написано выше, можно банить не только ботов, но и определённые браузеры на форуме, процесс точно такой-же как и для ботов, нужно добавить в раздел Поисковые боты нужный браузер (его UserAgent) и отметить его как запрещённого.
--
Скриншоты:

Опции в адм. разделе


Редактирование/создание бота


Список ботов


Результат посещения
Ro
Romnik
Сообщения: 5
Зарегистрирован: 22 окт 2012, 09:32
Сообщение

Бан поисковых ботов на форуме phpBB3

23 окт 2012, 10:09

В коде ошибка.
В админке в общем списке ботов при выборе в выпадающем меню "запретить" - удаляет.
Аватара пользователя
PPK
Администратор
Благодарил (а): 82 раза
Поблагодарили: 1621 раз
Сообщения: 10284
Зарегистрирован: 21 мар 2009, 17:13
Сообщение

Бан поисковых ботов на форуме phpBB3

23 окт 2012, 10:19

перепробовал все варианты - НЕ удаляет.
Ro
Romnik
Сообщения: 5
Зарегистрирован: 22 окт 2012, 09:32
Сообщение

Бан поисковых ботов на форуме phpBB3

23 окт 2012, 13:45

Перепроверил установку - всё точно по инструкции, в правках ошибки нет.
В "Настройка бота" всё работает правильно, там и баню.

Первым делом забанил:
Название бота: Ezooms [Bot]
Соответствие агенту: Ezooms/1.0

Название бота: Ahrefs.com [Bot]
Соответствие агенту: AhrefsBot/4.0

Ещё советую спам-бот Xrumer добавить в список ботов и соответственно отправить его в читатели, чтобы не спамил.
Название бота: Xrumer [Spam-Bot]
Соответствие агенту: xpymep.exe
Аватара пользователя
serrrios
Благодарил (а): 11 раз
Поблагодарили: 119 раз
Сообщения: 1532
Зарегистрирован: 29 май 2009, 20:22
Сообщение

Бан поисковых ботов на форуме phpBB3

23 окт 2012, 20:12

Один вопрос....ЗАЧЕМ? Кому мешает лишняя индексация??
Насчет хрумера(и всей подобной хераты) - капча рулет, контрольный вопрос рулит, прямые руки не из жопы тоже несут положительный фактор..
http://aniproject.ru - перспектива... велком епта..
http://www.ppkbb3cker.ru/viewtopic.php?f=35&t=1042 - мои платные услуги по трекеру.
Ro
Romnik
Сообщения: 5
Зарегистрирован: 22 окт 2012, 09:32
Сообщение

Бан поисковых ботов на форуме phpBB3

23 окт 2012, 22:19

Так может рассуждать только начинающий школьник.

Бот Ahrefs.com приходит не один, а толпой от нескольких десятков до нескольких сотен одновременно.
И он приходит не регится, а сканировать бэки. Грузит сервер конкретно.
Много ботов которые конкретно гадят ресурсу, Ezooms среди них.

Добавлено спустя 2 минуты 18 секунд:
serrrios писал(а):капча рулет
Капча уже давно не рулит...
Аватара пользователя
serrrios
Благодарил (а): 11 раз
Поблагодарили: 119 раз
Сообщения: 1532
Зарегистрирован: 29 май 2009, 20:22
Сообщение

Бан поисковых ботов на форуме phpBB3

24 окт 2012, 11:30

О как, я начинающий школьник хВ запомнимс =В
Сервер грузит? А может его надо оптимизировать, чтоб такого не было?)
И как же они гадят?)))
http://aniproject.ru - перспектива... велком епта..
http://www.ppkbb3cker.ru/viewtopic.php?f=35&t=1042 - мои платные услуги по трекеру.
Аватара пользователя
votept
Благодарил (а): 49 раз
Поблагодарили: 62 раза
Сообщения: 806
Зарегистрирован: 18 июл 2010, 17:57
Сообщение

Бан поисковых ботов на форуме phpBB3

24 окт 2012, 12:33

:D О! Серега ты школьник? Я не знал. Ахах.
Аватара пользователя
serrrios
Благодарил (а): 11 раз
Поблагодарили: 119 раз
Сообщения: 1532
Зарегистрирован: 29 май 2009, 20:22
Сообщение

Бан поисковых ботов на форуме phpBB3

24 окт 2012, 12:40

Но, выходит так хВВВВВВВВВВВВ
http://aniproject.ru - перспектива... велком епта..
http://www.ppkbb3cker.ru/viewtopic.php?f=35&t=1042 - мои платные услуги по трекеру.
Аватара пользователя
9CaraTT
Благодарил (а): 230 раз
Поблагодарили: 228 раз
Сообщения: 3085
Зарегистрирован: 13 мар 2011, 15:23
Сообщение

Бан поисковых ботов на форуме phpBB3

24 окт 2012, 15:58

Грузит сервер конкретно.
.htaccess, iptables, ограничить число одновременных подключений с данного адреса и ещё способы есть разные
прямые руки не из жопы тоже несут положительный фактор..

Вернуться в «Минимоды и хаки для phpBB3»