Взято отсюда... Наше решение описано на этой странице. Поисковые системы постоянно индексируют сайт, себя они прописываю примерно так: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) Эту строку мы возмём из $_SERVER["HTTP_USER_AGENT"], когда мы видим, что к нам на сайт зашел такой робот, в данном случае Google, мы будем убирать ненужные ссылки (от спама закрываем email адреса наших пользователей), чтобы он их не нашёл и будем тормозить его на 10 секунд (если не сделать, то в секунду будет обращаться к программе до 20 раз, потому что сам включает 10 процессов Php на Вашем сайте одновременно, то есть включает 10 роботов, что может привести к обвалу Ваших баз. <?php // сначала получим строку с сервера с параметрами о клиенте $user_agent = $_SERVER["HTTP_USER_AGENT"]; // применим функцию, о этой функции здесь $user_arr = detect_browser ($user_agent); // $BName - это имя броузера (Explore) $BName = $user_arr[0]; // $BVersion - его модификация (6.0) $BVersion = $user_arr[1]; // $BPlatform - операционная система пользователя (Windows 98) $BPlatform = $user_arr[2]; // $Brobot - имя робота, если это робот. (Rambler) $Brobot = $user_arr[3]; // если зашёл робот - тормозим его if ($BName == 'Robot'){ sleep (10);} // следующую ссылку робот не увидит if ($BName != "Robot") {echo"ссылка, которая роботу не видна";} ?> | Всё хорошо, но есть одно но....... Дело в том, что $_SERVER["HTTP_USER_AGENT"] можно запросто подделать, это строка дана нашему серверу самим пользователем и он, при желании, как хочет может её менять... Не верите, скачайте Teleport Pro, 1.29.2012 и убедитесь сами. Teleport Pro, 1.29.2012 - по этой ссылке лежит тот самый робот, который преспокойно прописывает Referer, Cookie и броузер, хотя по сути является роботом без cookie и referer. Вы скажете зачем нужно прописывать себя броузером с реферер, да еще и с куками??? Уважающие себя сервера, типа: Rambler, Yandex, Google никогда не пропишут себя броузером, а вот нахальные, в основном, наши Российские сервера, не гнушаются и прописывают себя, например, Explore 5.0 и всё, что нами было закрыто для роботов скачивают с сайта, причём без тормоза на 20 секунд... Но, раз мы сказали Роботам, что некоторые ссылки скачивать нельзя (например email адреса - против спама), значит их скачивать нельзя. Но наши Бэд поисковики ставят себя, например: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) Как же определить такие псевдо поисковики и дать им должный отпор. На нашем сайте эта проблема начала решаться только сейчас. <img src="html_stat.php" alt="" width="0" height="0" border="0"> Прописываем такую строку во всех html файлах, то есть это как-будто картинка, а на самом деле php файл со статистикой. После этого, проверяем файл с основной статистикой и тот, который запишется из html кода при подключении html_stat.php . Как читают файлы поисковики: $file = @implode ( "", @file ( $file ) ); При таком прочтении файла наша картинка, то есть наш файл php html_stat.php грузиться не будет, поэтому при сравнении основной статистики и дополнительного файла из html разметки, мы поймём, что кто-то хочет нас надуть и прописал себя броузером, хотя по сути, таковым не является. После этого, мы можем, вообще, забанить такого пользователя если захотим, либо сделать после таких обнаружений, просто его роботом, каковым по сути он и является, независимо от того, что наш сервер выдал информацию о том, что на сайт зашел пользователь с броузером. Зачем я всё это затеял, а просто потому что на нашем сайте всё чаще и чаще появляются именно такие лже поисковики, скачивают то, что я специально спрятал от них. Теперь при таком подходе, у них не получится заполучить емайлы пользователей для спама, итд. То есть, если бы все пользовались таким подходом, слово СПАМ, может быть, и не существовало бы. Вы спросите, а почему об этом никто не говорит? Да потому, что все повешенные на сайтах банеры, всё тех же Spylog и Rambler, никак не могут знать про тех роботов, которые заходили к вам на сайт, а если посмотреть, то это, иногда, даже больше, чем было обычных посетителей с броузерами. То есть, кричать об этом очень не выгодно для них, так как роботов они не определяют, а значит, программу статистики надо делать самому, а все банеры выбросить на помойку... В общем, делайте статистику себе сами и ни на кого не надейтесь, а то постоянно будете удивлены, что вроде и народу то на сайте не было, а все базы с данными вылетели, и пароль Ваш обнаружен каким-то пользователем, и ещё всякая куча удивлений может быть....... Для наглядности, специально завели страничку, смотреть здесь, где Вы будете заходить в интернет не броузером, а Роботом. Второй способ, который можно попытаться использовать - это проверять хедер. Если на вашем хосте отключена поддержка сокетных соединений, то Вы можете попробовать отличить робот от броузера, потому что хедер - запроса в этом случае не будет. То есть, перед тем как сервер отдает страничку броузеру, он сам сначала принимает от этого броузера запрос, который и называется хедером: Host: 127.0.0.1 Accept: text/html;q=0.9, image/jpeg, image/gif, */*;q=0.1 Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0 Accept-Language: ru Connection: keep-alive Это и есть хедер, который любой броузер отсылает серверу перед приемом с него странички в формате html. Если сокетное соединение доступно, то верить хедеру нельзя, так как любой может его подделать. Но, на крайний случай, можно проверить все составляющие запроса, и, если какая-то пуста, значит пришел робот. <?php if ( $_SERVER['HTTP_ACCEPT']=='' or $_SERVER['HTTP_ACCEPT_ENCODING']=='' or $_SERVER['HTTP_ACCEPT_LANGUAGE']=='' or $_SERVER['HTTP_CONNECTION']=='' ){ print "Зашел робот.........";} ?> | Как первый способ, приведенный здесь, так и второй не дает гарантии в правильности наших рассуждений. Дело в том, что есть ещё библиотека Curl, в которой запрос на сервер можно подделать полностью, нельзя подделать только Ip адрес. Как это реализуется читать здесь. Что получается, что даже проверка хедера нам ничего не даёт!!! Curl спокойно это обходит. Но, что же делать? Итак давайте ещё раз поставим задачу: -
Без поисковиков нам не обойтись, поэтому не допускать всех роботов нельзя, значит надо оставить место для нормальных поисковиков, чтобы они спокойно наш сайт индексировали. -
Есть так же продвинутые пользователи, которые выключают сами передачу строки о их броузере и $_SERVER["HTTP_USER_AGENT"] пуст. Но, есть и такие, которым приходится подключать у себя сетевой экран, который не даёт возможность передавать заголовок о броузере (Это сделано в некоторых корпоративных сетях и пользователь никак не может от этого отказаться). Тогда пишем, что броузер не определён, просим выключить сетевой экран, если это не возможно, то просим отправить на наш емайл Ip, с которого заходит такой пользователь, вносим этот Ip в базу допущенных. И, в следующий раз не проверяем у этого Ip, строку о броузере. Посмотреть как это выглядит... <?php if ( $_SERVER["HTTP_USER_AGENT"] == '' ) { print "Ваш броузер не определён, выключите сетевой экран, если это невозможно, то отправьте нам Ваш Ip адрес, для внесения в базу, допущенных Ip."; exit; } ?> | -
Есть безобидные Бэд Роботы, они скачивают единичные странички, убирают из них всё, что считают нужным, и ставят на своём сайте в своих шаблонах нашу информацию. Как-будто они сами её имеют на своём сайте. Обычно они даже не прописывают в хедере строку $_SERVER["HTTP_USER_AGENT"] - это строка у них пуста. Сразу же можем обрубить им любой заход на сайт, точно таким же образом, как и в прошлый раз. Посмотреть как это выглядит... <?php if ( $_SERVER["HTTP_USER_AGENT"] == '' ) { print "Ваш броузер не определён, выключите сетевой экран, если это невозможно, то отправьте нам Ваш Ip адрес, для внесения в базу, допущенных Ip."; exit; } ?> | -
Есть Бэд Роботы, которые прописывают $_SERVER["HTTP_USER_AGENT"], но так же не посылают другие заголовки на наш сервер. Они тоже считывают единичные странички и выставляют их у себя за свои. Мы можем сделать следующее <?php if ( $_SERVER["HTTP_USER_AGENT"] == '' ) { print "Ваш броузер не определён, выключите сетевой экран, если это невозможно, то отправьте нам Ваш Ip адрес, для внесения в базу, допущенных Ip."; exit; } // если нет некоторых заголовков, которые делают обычные // броузеры, значит пришёл робот, останавливаем программу if ( $_SERVER['HTTP_ACCEPT']=='' or $_SERVER['HTTP_ACCEPT_ENCODING']=='' or $_SERVER['HTTP_ACCEPT_LANGUAGE']=='' or $_SERVER['HTTP_CONNECTION']=='' ){ exit; } ?> | Не очень хорошее решение, потому что нормальные броузеры тоже могут не посылать дополнительные заголовки. Я, например, сделал что-то среднее, я проверяю эти заголовки, и, если хотя бы ДВА из них не пусты, считаю, что пришёл броузер. Практика показала, что многие броузеры действительно посылают не все заголовки. -
И, наконец, самые махровые воры (те, с кем собственно говоря, и надо бороться), самые плохие Бэд Роботы, которые включают робота со всеми заголовками, со строкой о броузере, скачивают сайт полностью, потом размещают всю нашу информацию у себя на сайте, не прикладывая никакого своего труда. Первые три группы, описанных выше Бэд роботов, можно считать безобидными по отношению к этим, потому что их хоть как-то можно распознать. К сожаленью, последних распознать не удаётся. Можно, по скорости считывания страниц, но опять же не всегда. Предлагалось, как-бы тормозить их, если программа видит, что пользователь через чур быстро загружает странички нашего сайта. Я подумаю над этой проблемой, дело в том, что при торможении пользователя, будет тормозиться и наш сайт. В итоге, принимаем кардинальное решение. Если произошло более, например 300 скачек страниц нашего сайта, и программа не определила, что это робот, баним его навсегда. Посмотреть как это выглядит... <?php // если нет строки указывающий броузер, значит пришёл робот if ( $_SERVER["HTTP_USER_AGENT"] == '' ) { print "Ваш броузер не определён, выключите сетевой экран, если это невозможно, то отправьте нам Ваш Ip адрес, для внесения в базу, допущенных Ip."; $BName = 'Robot'; } // если нет некоторых заголовков, которые делают обычные // броузеры, значит пришёл робот if ( $_SERVER['HTTP_ACCEPT']=='' or $_SERVER['HTTP_ACCEPT_ENCODING']=='' or $_SERVER['HTTP_ACCEPT_LANGUAGE']=='' or $_SERVER['HTTP_CONNECTION']=='' ){ $BName = 'Robot'; } // если пользователь скачал более 300 страничек нашего сайта // и наша программа говорит , что это броузер // останавливаем программу if ( $hits> 300 and $BName != 'Robot' ){ $BName = 'Robot bad'; exit ; } ?> | -
Так же давайте разграничим сами Поисковые системы, зачем нам на сайте нужны такие, от которых нет толка, то есть от них в итоге к нам никто не заходит. В этом случае составим список тех поисковиков, которые к сайту допущены. На данный момент, у нас в базе есть такие Хорошие поисковики: yadirectbot yandex webalta rambler googlebot aport yahoo msnbot turtle mail.ru omsktele yetibot picsearch sape.bot gigabot snapbot alexa.com | Остальных роботов будем считать плохими и будем давать им скачать, например, всего 50 страниц сайта. Как мы это сделаем. Пишем регулярное выражение и заводим такой скрипт, где файл с хорошими роботами называется $base_robot. В нём построчно лежат все те роботы, которые перечислены выше: <?php // функция считывает файл и // составляет регулярное выражение function base_for_search ($path){ $path = str_replace ("\r","", trim ( implode ("", @file ($path)))); return "~(" . str_replace ("\n","|", preg_quote ($path,"~")) . ")~i"; } // строка, которую будем искать // в $_SERVER["HTTP_USER_AGENT"] $search = base_for_search ($base_robot); // если нашли, значит хороший робот, // то даём скачивать хоть сколько страниц if ( preg_match ( $search, $path, $arr_r ) ) { print "разрешённые поисковики"; } // если не нашли, значит бэд поисковик, // даём скачать только 50 страниц elseif ($hits> 50){ $BName = 'Robot bad'; exit ; } ?> | -
И, наконец, самые продвинутые пользователи интернета сделают так, что в строках заголовка пропишут себя Хорошим роботом, например Яндексом, и преспокойно скачают весь наш сайт. Нужно проверять правильно ли себя прописал робот через, например, каждые 300 обращений к нашему сайту. Как это сделать? Заходить на whoise сервер (смотреть здесь), парсить страничку и сверять принадлежит ли этому Роботу данный Ip адрес. На самом деле, нормальных поисковиков не так и много, поэтому сделать это вполне возможно. -
В заключении, на самом деле, может быть это всё бред, потому что у самих поисковиков, например у Яндекса, нет никакой защиты, описанной выше (вернее она стоит, но только из примера номер 2). Это означает, что программисты с Яндекса поняли, что бороться с этим не возможно, что даёт нам возможность спокойно подключить поиск в Яндексе, как свой (что, конечно, является нелепостью). Кто его знает, может быть мы найдём решение, как бороться с этим явлением, по имени Флуд... Что в итоге получилось: -
есть база, в которой подсчитываем сколько кликов было с того или иного Ip адреса (база сохраняет только данные за последние 24 часа). -
смотрим чему равна $_SERVER["HTTP_USER_AGENT"], если она по длине менее чем 4 символа (Апорт например, иногда себя прописывает как: Aport), говорим, что броузер не определен и не пускаем такого пользователя дальше первой страницы сайта. -
при этом пишем: Если у Вас включён сетевой экран просим его отключить, если это невозможно, дайте Ваш Ip адрес, мы занесём его в базу с разрешёнными Ip. Заносим такие ip в базу, и если с них приходят пользователи, сами присваиваем им строку $_SERVER["HTTP_USER_AGENT"], так, чтобы программа не думала, что это робот. -
если 2, 3 пункты ложь, подключаем программу, которая определит броузер. Об этой функции ранее было рассказано здесь. -
если видим, что пользователь с броузером скачал более 300 страниц, баним его и не пускаем далее первой страницы сайта, предполагая, что нормальный человек более 300 страниц никогда скачивать не будет. Естественно, для разных сайтов это цифра разная, на нашем сайте я принял цифру 250. За семь лет работы нашего сайта самый активный пользователь кликнул за сутки 100 раз. -
если видим, что на сайте робот, то смотрим базу по допущенным роботам. Если он не входит в базу, то более 50 раз не даём скачать ему странички, и далее первой страницы сайта его не пускаем, говоря опять же: Если у Вас включён сетевой экран просим его отключить, если это невозможно, дайте Ваш Ip адрес, мы занесём его в базу с разрешёнными Ip. -
если видим, что робот допущен, то проверяем $user_host = @gethostbyaddr ($user_ip); а правду ли он нам говорит, если обманывает, присваиваем ему имя Неизвестный робот. То есть, просто добавляем строки в скрипт: if ($BName=='Robot'){ # если робот представился Google Yandex Yahoo Rambler Msnbot if (($Brobot == 'Googlebot' and !preg_match ("~googlebot\.com~", $user_host)) or ($Brobot == 'Yandex' and !preg_match ("~yandex\.ru~", $user_host)) or ($Brobot == 'Yahoo' and !preg_match ("~yahoo\.net~", $user_host)) or ($Brobot == 'Rambler' and !preg_match ("~rambler\.ru~", $user_host)) or ($Brobot == 'Msnbot' and !preg_match ("~search\.live\.com~", $user_host)) ){ $_BName = 'Robot'; $_Brobot = 'Unknown'; } } Вы видите, что проблема решена: Пользователи более 250 раз скачивать ничего не могут. Нормальные роботы скачивают сайт полностью без ограничений. Плохие роботы, если представляются броузерами, скачивают только 250 страниц, если представляются роботом более 50 страниц скачать не могут. Вы видите, что все дыры связанные с доступом к сайту закрыты. Проблема решена, пусть жестоко, но честно, мне надоело, что кто-то постоянно без зазрения совести скачивает наш сайт, хотя это ему никто не разрешал. В скором времени выложу полный архив статистики, в котором весь этот механизм будет прописан. P.S. Данный механизм допускает ошибку (с разных IP один и тот же пользователь будет скачивать наш сайт роботом), поэтому изощримся ещё больше и придумаем Ловушку для Бэд Робота. Как её можно сделать? Вспомним, сначала робот скачивает все ссылки с сайта, сортирует их и потом начинает движение по скачанным ссылкам. Создадим ссылку, которую нормальный броузер (то есть обычный пользователь) не увидит, а значит не кликнет на неё. А вот Бэд Робот, скачает её и попробует зайти по данной ссылке, где его будет ждать наша ловушка. На всех страницах данного сайта я поставил такой HTML текст: <a href='all.php?act=fuck_you'> <img src='img/bud2.gif' width='1' height='1' border='0'> </a> Вы видите, что это простая картинка, но ссылкой и размером по одному пикселю, то есть в броузере её видно не будет, а вот Робот её точно скачает. Тогда в Php файле пишем строки: <?php // ловушка для bad robota // если на сайте броузер, то переменная $fuck_you будет равна плохой ссылке if ($mm->BName!='Robot'){ $fuck_you = "<a href='all.php?act=fuck_you'> <img src='img/bud2.gif' width='1' height='1' border='0'> </a>"; } // далее переменную $fuck_you подставляем во все html страницы // то есть во все докменты мы прописываем эту ссылку, // нормальный пользователь никогда на ней не кликнет, но // если по БЭД ссылке кто-то пытается зайти, то это точно плохой робот // на 100 %, пишем его IP в базу забаненных навсегда if ( $act=='fuck_you' ){ $fopen = new fopen($banlist_sait); $general = $fopen->file(); $lines = count ($general); for ( $i = 0; $i < $lines; $i++){ $s = trim ($general[$i]); $arr[$s] = $s; } // IP Бэд Робота, который сейчас на сайте, в переменной $mm->user_ip $arr[$mm->user_ip] = $mm->user_ip; sort ($arr); reset ($arr); while ( list ($key, $val) = @each ($arr)){ $content .= $val."\n"; } $fopen->ftruncate(); $fopen->fwrite($content); $content = ''; $fopen -> fclose (); } // теперь в базе появился IP, который точно хотел нас обмануть. // после этого делаем с ним, что захотим. // например, делаем следующее: // скачиваем файл с забаненными Ip в переменную $content_banen_ip $fopen = new fopen ($banlist_sait); $content_banen_ip = $fopen -> fread ( filesize ($banlist_sait)); $fopen -> fclose (); // изменяем IP пользоваетеля, который сейчас на сайте // для подстановки в регулярное выражение $search_banen_ip = "~" . preg_quote ($mm->user_ip,"~")."~s"; // смотрим есть ли IP пользоваетля в переменной $content_banen_ip // то есть в базе забаненных IP if ( preg_match ($search_banen_ip, $content_banen_ip)) { // если IP нашелся в базе приходим сюда // печатаем, что доступ этого IP закрыт print " <html><head> <title>Closed ".$mm->user_ip."</title></head><body> <b>".$mm->user_ip."</b> - доступ закрыт. <br>Причина: <b>Bad robot...</b> </body></html>"; // скачиваем файл размером в 5 Мб в переменную $contents $filename = "zip/php-4.1.2-Win32.zip"; $handle = @fopen ( $filename , "rb" ); if ($handle){ $contents = @fread ( $handle , @filesize ( $filename )); @fclose ( $handle ); } // увеличиваем в цикле переменную $content до 250 Мб for ($i = 0; $i < 50; $i++){ $content .= $contents; } // отдаём 250 Мб Бэд роботу, пусть скачивает print $content; // останавливаем программу на этом месте и ничего // больше не видит Робот exit ; } ?> | Вы видите, что когда сайт индексирует Робот, то переменная $fuck_you пуста, значит и в HTML тексте не будет строки с Бэд ссылкой, но если на сайте броузер, то во всех документах будет строка с этой ссылкой. То, чего мы и добивались, только броузеры увидять Бэд ссылку, но нормальные пользователи никогда на ней не кликнут, а вот программа - Бэд Робот обязательно зайдёт. Что я делаю с такими Бэд Роботами, все кто записан в эту базу получают от меня страницу html в 250 Мегобайт. Может быть, хоть это немного остановит людей, которые используют специальные программы для скачки сайтов. Кто думает, что я сгущаю краски, то посмотрите здесь нашу статистику по роботам, и Вы увидите, что проблема существует. Роботов моя программа делит: на тех кому разрешено индексировать сайт, на роботов не допущенных до индексации, на роботов, которые себя никак не прописывают, на роботов, которые представляются броузерами и на Забаненных. P.S. Этот механизм можно увидеть в скрипте нашего сайта, смотреть здесь... Скачайте его и посмотрите. Кроме этого, я усилил его. Теперь ловушка для бэд робота состоит из массива ссылок, которые меняются в .html тексте так, что проследить и сделать анти защиту нельзя. Теперь все пути для скачивания сайта перекрыты. http://omsk777.ru/ |