Necessidade de impedir que os robôs matem meu servidor da Web

9

Estou tendo problemas com bot EXTREME em alguns sites da minha conta de hospedagem. Os bots utilizam mais de 98% dos recursos da minha CPU e 99% da minha largura de banda para toda a minha conta de hospedagem. Esses bots estão gerando mais de 1 GB de tráfego por hora para meus sites. O tráfego humano real para todos esses sites é inferior a 100 MB / mês .

Fiz uma extensa pesquisa no arquivo robots.txt e no arquivo .htaccess para bloquear esses bots, mas todos os métodos falharam.

Também coloquei código nos arquivos robots.txt para bloquear o acesso aos diretórios de scripts, mas esses bots (Google, MS Bing e Yahoo) ignoram as regras e executam os scripts de qualquer maneira.

Não quero bloquear completamente os bots do Google, MS Bing e Yahoo, mas quero limitar a taxa de rastreamento. Além disso, adicionar uma instrução de atraso de rastreamento no arquivo robots.txt não diminui a velocidade dos bots. Meu código robots.txt e .htacces atual para todos os sites estão indicados abaixo.

Eu configurei as ferramentas para webmasters da Microsoft e do Google para diminuir a taxa de rastreamento para o mínimo absoluto, mas eles ainda estão acessando esses sites a uma taxa de 10 hits / segundo.

Além disso, toda vez que eu carrego um arquivo que causa um erro, todo o servidor da Web VPS fica inoperante em segundos, de modo que eu nem consigo acessar o site, corrigindo o problema devido ao ataque de hits desses bots.

O que posso fazer para interromper o tráfego no slot dos meus sites?

Tentei perguntar à minha empresa de hospedagem na web (site5.com) várias vezes sobre esse problema nos últimos meses e eles não podem me ajudar com esse problema.

O que eu realmente preciso é impedir que os Bots executem o script rss2html.php. Tentei as duas sessões e os cookies e ambos falharam.

robots.txt

User-agent: Mediapartners-Google
Disallow: 
User-agent: Googlebot
Disallow: 
User-agent: Adsbot-Google
Disallow: 
User-agent: Googlebot-Image
Disallow: 
User-agent: Googlebot-Mobile
Disallow: 
User-agent: MSNBot
Disallow: 
User-agent: bingbot
Disallow: 
User-agent: Slurp
Disallow: 
User-Agent: Yahoo! Slurp
Disallow: 
# Directories
User-agent: *
Disallow: /
Disallow: /cgi-bin/
Disallow: /ads/
Disallow: /assets/
Disallow: /cgi-bin/
Disallow: /phone/
Disallow: /scripts/
# Files
Disallow: /ads/random_ads.php
Disallow: /scripts/rss2html.php
Disallow: /scripts/search_terms.php
Disallow: /scripts/template.html
Disallow: /scripts/template_mobile.html

.htaccess

ErrorDocument 400 http://english-1329329990.spampoison.com
ErrorDocument 401 http://english-1329329990.spampoison.com
ErrorDocument 403 http://english-1329329990.spampoison.com
ErrorDocument 404 /index.php
SetEnvIfNoCase User-Agent "^Yandex*" bad_bot
SetEnvIfNoCase User-Agent "^baidu*" bad_bot
Order Deny,Allow
Deny from env=bad_bot
RewriteEngine on
RewriteCond %{HTTP_user_agent} bot\* [OR]
RewriteCond %{HTTP_user_agent} \*bot
RewriteRule ^.*$ http://english-1329329990.spampoison.com [R,L]
RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|\%3D) [OR]
# Block out any script trying to base64_encode crap to send via URL
RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [OR]
# Block out any script that includes a <script> tag in URL
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
# Block out any script trying to set a PHP GLOBALS variable via URL
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
# Block out any script trying to modify a _REQUEST variable via URL
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
# Send all blocked request to homepage with 403 Forbidden error!
RewriteRule ^(.*)$ index.php [F,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/index.php
RewriteCond %{REQUEST_URI} (/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$  [NC]
RewriteRule (.*) index.php
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
# Don't show directory listings for directories that do not contain an index file (index.php, default.asp etc.)
Options -Indexes
<Files http://english-1329329990.spampoison.com>
order allow,deny
allow from all
</Files>
deny from 108.
deny from 123.
deny from 180.
deny from 100.43.83.132

ATUALIZAÇÃO PARA MOSTRAR AGENTE DE USUÁRIO ADICIONADO BOTÃO DE CÓDIGO

<?php
function botcheck(){
 $spiders = array(
   array('AdsBot-Google','google.com'),
   array('Googlebot','google.com'),
   array('Googlebot-Image','google.com'),
   array('Googlebot-Mobile','google.com'),
   array('Mediapartners','google.com'),
   array('Mediapartners-Google','google.com'),
   array('msnbot','search.msn.com'),
   array('bingbot','bing.com'),
   array('Slurp','help.yahoo.com'),
   array('Yahoo! Slurp','help.yahoo.com')
 );
 $useragent = strtolower($_SERVER['HTTP_USER_AGENT']);
 foreach($spiders as $bot) {
   if(preg_match("/$bot[0]/i",$useragent)){
     $ipaddress = $_SERVER['REMOTE_ADDR']; 
     $hostname = gethostbyaddr($ipaddress);
     $iphostname = gethostbyname($hostname);
     if (preg_match("/$bot[1]/i",$hostname) && $ipaddress == $iphostname){return true;}
   }
 }
}
if(botcheck() == false) {
  // User Login - Read Cookie values
     $username = $_COOKIE['username'];
     $password = $_COOKIE['password'];
     $radio_1 = $_COOKIE['radio_1'];
     $radio_2 = $_COOKIE['radio_2'];
     if (($username == 'm3s36G6S9v' && $password == 'S4er5h8QN2') || ($radio_1 == '2' && $radio_2 == '5')) {
     } else {
       $selected_username = $_POST['username'];
       $selected_password = $_POST['password'];
       $selected_radio_1 = $_POST['group1'];
       $selected_radio_2 = $_POST['group2'];
       if (($selected_username == 'm3s36G6S9v' && $selected_password == 'S4er5h8QN2') || ($selected_radio_1 == '2' && $selected_radio_2 == '5')) {
         setcookie("username", $selected_username, time()+3600, "/");
         setcookie("password", $selected_password, time()+3600, "/");
         setcookie("radio_1", $selected_radio_1, time()+3600, "/");
         setcookie("radio_2", $selected_radio_2, time()+3600, "/");
       } else {
        header("Location: login.html");
       }
     }
}
?>

Também adicionei o seguinte ao topo do script rss2html.php

// Checks to see if this script was called by the main site pages, (i.e. index.php or mobile.php) and if not, then sends to main page
   session_start();  
   if(isset($_SESSION['views'])){$_SESSION['views'] = $_SESSION['views']+ 1;} else {$_SESSION['views'] = 1;}
   if($_SESSION['views'] > 1) {header("Location: http://website.com/index.php");}
Sammy
fonte
Quando você atualizou o seu robots.txt? Pode levar algum tempo para os robôs lerem a versão atualizada.
Ilanco 18/05/12
alguns dias atrás. O que eu realmente preciso é impedir que os Bots executem o script rss2html.php. Tentei as duas sessões e os cookies e ambos falharam.
Como está rss2html.phpsendo usado pelo seu site? via PHP incluem, redireciona, Ajax ....?
cHao
Os arquivos rss2html.php é chamado através de um file_get_contents () de comando
file_get_contents...? Parece um pouco estranho. O arquivo está em outro servidor ou algo assim?
cHao 19/05/12

Respostas:

3

Se rss2html.phpnão estiver sendo usado diretamente pelo cliente (ou seja, se o PHP estiver sempre usando-o em vez de ser um link ou algo assim), então esqueça de tentar bloquear bots. Tudo o que você realmente precisa fazer é definir uma constante ou algo na página principal e depois includeo outro script. No outro script, verifique se a constante está definida e solte um erro 403 ou uma página em branco ou o que for, se não estiver definida.

Agora, para que isso funcione, você precisará usar, includee não file_get_contents, pois o último lerá apenas o arquivo (se você estiver usando um caminho local) ou será executado em um processo totalmente diferente (se você ' re usando um URL). Mas é o método que coisas como Joomla! usa para impedir que um script seja incluído diretamente. E use um caminho de arquivo em vez de uma URL, para que o código PHP ainda não seja analisado antes de tentar executá-lo.

Melhor ainda seria rss2html.phpsair da raiz do documento, mas alguns hosts dificultam a execução. Se essa é uma opção depende da configuração do seu servidor / host.

cHao
fonte
11
Chao, obrigado. Atualmente, estou reescrevendo meu código para converter o arquivo file_get_contents para incluir.
Sammy
4

Você pode configurar seu script para gerar um erro 404 com base na sequência de agentes do usuário fornecida pelos bots - eles receberão a dica rapidamente e o deixarão em paz.

if(isset($_SERVER['HTTP_USER_AGENT'])){
   $agent = $_SERVER['HTTP_USER_AGENT'];
}

if(preg_match('/^Googlebot/i',$agent)){
   http_response_code(301);
   header("HTTP/1.1 301 Moved Permanently");
   header("Location: http://www.google.com/");
   exit;
}

Pesquise seus logs e rejeite o Bingbot etc. de maneira semelhante - ele não interromperá as solicitações, mas poderá economizar alguma largura de banda - dê ao googlebot uma amostra de seu próprio remédio - Mwhahahahaha!

Atualizada

Olhando para o seu código, acho que seu problema está aqui:

if (preg_match("/$bot[1]/i",$hostname) && $ipaddress == $iphostname)

Se eles são bots maliciosos, podem vir de qualquer lugar, remova essa $ipaddresscláusula e jogue uma resposta 301 ou 404 neles.

Pensando bem ao lado da caixa

  1. O Googlebot nunca aceita cookies , por isso não pode armazená-los. De fato, se você precisar de cookies para todos os usuários, provavelmente isso impedirá o bot de acessar sua página.
  2. O Googlebot não entende formulários - ou - javascript, para que você possa gerar dinamicamente seus links ou fazer com que os usuários cliquem em um botão para acessar seu código (com um token adequado anexado).

    <a href="#" onclick="document.location='rss2html.php?validated=29e0-27fa12-fca4-cae3';">Rss2html.php</a>

    • rss2html.php? validated = 29e0-27fa12-fca4-cae3 - humano
    • rss2html.php - bot
web_bod
fonte
11
Não tão rápido quanto você imagina. Vi bots atingirem a mesma página inexistente há meses, ocasionalmente até anos após a exclusão da página. Depende de como o bot é bem-comportado e o que é depois dele.
cHao
A maneira como funciona para visitantes humanos é que o arquivo index.php chama o script rss2html.php. Os bots evitam o script index.php e executam diretamente o script rss2html.php. Como posso proteger esse arquivo rss2html.php se ele não foi acessado pelo script index.php?
Tente renomear rss2html.php para outra coisa e atualize seu index.php para referenciar o novo nome.
BluesRockAddict
Tentei renomear o arquivo, mas ele falhou após alguns dias. Como posso adicionar o código que estou usando neste segmento? Eu quero lhe mostrar o que eu tentei.
11
ok - Eu sei um truque que você pode puxar :) - colocar fora código de script rss2html.php do seu site (atualizará resposta)
2

Solicitações de sites de limite / bloqueio de PHP para spiders / bots / clientes etc.

Aqui eu escrevi uma função PHP que pode bloquear solicitações indesejadas para reduzir o tráfego do site. Bom para aranhas, bots e clientes irritantes.

CLIENTE / Bloqueador de Bots

DEMO: http://szczepan.info/9-webdesign/php/1-php-limit-block-website-requests-for-spiders-bots-clients-etc.html

CÓDIGO:

/* Function which can Block unwanted Requests
 * @return array of error messages
 */
function requestBlocker()
{
        /*
        Version 1.0 11 Jan 2013
        Author: Szczepan K
        http://www.szczepan.info
        me[@] szczepan [dot] info
        ###Description###
        A PHP function which can Block unwanted Requests to reduce your Website-Traffic.
        God for Spiders, Bots and annoying Clients.

        */

        # Before using this function you must 
        # create & set this directory as writeable!!!!
        $dir = 'requestBlocker/';

        $rules   = array(
                #You can add multiple Rules in a array like this one here
                #Notice that large "sec definitions" (like 60*60*60) will blow up your client File
                array(
                        //if >5 requests in 5 Seconds then Block client 15 Seconds
                        'requests' => 5, //5 requests
                        'sek' => 5, //5 requests in 5 Seconds
                        'blockTime' => 15 // Block client 15 Seconds
                ),
                array(
                        //if >10 requests in 30 Seconds then Block client 20 Seconds
                        'requests' => 10, //10 requests
                        'sek' => 30, //10 requests in 30 Seconds
                        'blockTime' => 20 // Block client 20 Seconds
                ),
                array(
                        //if >200 requests in 1 Hour then Block client 10 Minutes
                        'requests' => 200, //200 requests
                        'sek' => 60 * 60, //200 requests in 1 Hour
                        'blockTime' => 60 * 10 // Block client 10 Minutes
                )
        );
        $time    = time();
        $blockIt = array();
        $user    = array();

        #Set Unique Name for each Client-File 
        $user[] = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : 'IP_unknown';
        $user[] = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
        $user[] = strtolower(gethostbyaddr($user[0]));

        # Notice that I use files because bots do not accept Sessions
        $botFile = $dir . substr($user[0], 0, 8) . '_' . substr(md5(join('', $user)), 0, 5) . '.txt';


        if (file_exists($botFile)) {
                $file   = file_get_contents($botFile);
                $client = unserialize($file);

        } else {
                $client                = array();
                $client['time'][$time] = 0;
        }

        # Set/Unset Blocktime for blocked Clients
        if (isset($client['block'])) {
                foreach ($client['block'] as $ruleNr => $timestampPast) {
                        $elapsed = $time - $timestampPast;
                        if (($elapsed ) > $rules[$ruleNr]['blockTime']) {
                                unset($client['block'][$ruleNr]);
                                continue;
                        }
                        $blockIt[] = 'Block active for Rule: ' . $ruleNr . ' - unlock in ' . ($elapsed - $rules[$ruleNr]['blockTime']) . ' Sec.';
                }
                if (!empty($blockIt)) {
                        return $blockIt;
                }
        }

        # log/count each access
        if (!isset($client['time'][$time])) {
                $client['time'][$time] = 1;
        } else {
                $client['time'][$time]++;

        }

        #check the Rules for Client
        $min = array(
                0
        );
        foreach ($rules as $ruleNr => $v) {
                $i            = 0;
                $tr           = false;
                $sum[$ruleNr] = 0;
                $requests     = $v['requests'];
                $sek          = $v['sek'];
                foreach ($client['time'] as $timestampPast => $count) {
                        if (($time - $timestampPast) < $sek) {
                                $sum[$ruleNr] += $count;
                                if ($tr == false) {
                                        #register non-use Timestamps for File 
                                        $min[] = $i;
                                        unset($min[0]);
                                        $tr = true;
                                }
                        }
                        $i++;
                }

                if ($sum[$ruleNr] > $requests) {
                        $blockIt[]                = 'Limit : ' . $ruleNr . '=' . $requests . ' requests in ' . $sek . ' seconds!';
                        $client['block'][$ruleNr] = $time;
                }
        }
        $min = min($min) - 1;
        #drop non-use Timestamps in File 
        foreach ($client['time'] as $k => $v) {
                if (!($min <= $i)) {
                        unset($client['time'][$k]);
                }
        }
        $file = file_put_contents($botFile, serialize($client));


        return $blockIt;

}


if ($t = requestBlocker()) {
        echo 'dont pass here!';
        print_R($t);
} else {
        echo "go on!";
}
dazzafact
fonte
1

É provável que seu site esteja sendo indexado por bot (s) falso (s) do Google. Você pode tentar adicionar um cheque e servir 404 para todos os pedidos falsos de bot do Google.

Aqui está um artigo que explica como verificar o Googlebot: http://googlewebmastercentral.blogspot.com/2006/09/how-to-verify-googlebot.html

Além disso, você pode verificar seus registros em relação aos bots falsos conhecidos: http://stopmalvertising.com/security/fake-google-bots.html

BluesRockAddict
fonte
Obrigado, mas na verdade eu tentei isso também, determinando os agentes do usuário e enviando os bots para uma página de login. Isso também falhou.
Parece que você está perdendo o ponto - confiar no agente do usuário para determinar a autenticidade do bot não é suficiente.
BluesRockAddict
1

Você deve realmente garantir, em primeiro lugar, que qualquer página solicitada a um agente do usuário, seja qual for o rastreador abusivo que você possui, receberá uma página estática.

Um apache mod_rewrite com uma condição ou equivalente ao seu servidor http. Para o apache, algo como isto:

RewriteCond  %{HTTP_USER_AGENT}  ^GoogleBot [OR]
RewriteCond  %{HTTP_USER_AGENT}  ^OtherAbusiveBot
RewriteRule  ^/$                 /static_page_for_bots.html  [L]
smassey
fonte
obrigado, mas não quero bloquear completamente os bots do Google, MS Bing e Yahoo, mas quero limitar os hits diretos no arquivo de script rss2html.php. Eu só preciso adicionar algo ao início do script rss2html.php que impedirá sua execução se não tiver sido acessado pelo script index.php. Os bots estão atualmente executando o script rss2html.php ignorando o arquivo index.php.
Sammy
Isso não os bloqueia. Você simplesmente serve uma versão em cache do seu php. Isso é muito fácil para todo o servidor, é menos uma instância de php / menos um processo filho do apache. => Custo (arquivo estático) <Custo (instância do php).
Smassey 18/05
como eu armazenaria em cache as páginas? Como as páginas são RSS, as páginas em cache serão atualizadas com frequência suficiente para fornecer dados atualizados?
Sammy
Claro ... Escreva um cronograma que faça isso por você. Se você diz que eles atingem o servidor 10req / s, se você armazena em cache as páginas por 1 minuto, você salvou 599 instâncias de php extras (que certamente incluem conexões / consultas de banco de dados) .. E uma vez por minuto é muito mais do que eu votaria para: 10 / 15min.
Smassey #:
1

Para continuar na postagem de smassey, você pode colocar várias condições:

RewriteCond  %{HTTP_USER_AGENT}  ^GoogleBot [OR]
RewriteCond  %{HTTP_USER_AGENT}  ^OtherAbusiveBot
RewriteRule  ^rss2html\.php$     /static.html  [L]

Dessa forma, os bots ainda acessam suas páginas, mas não apenas essa. Como é estranho que os bots (legítimos) não cumpram as regras, você tem referenciadores que enviam bots para sua página de outras fontes (encaminhamento de nome de domínio, ...)

ndrix
fonte
1

Eu resolvi o mesmo problema com o script disponível em http://perishablepress.com/blackhole-bad-bots/ . Com essa abordagem de buraco negro, coletei uma lista de ip malicioso e, em seguida, usei o .htaccess. (O que não é obrigatório, já que o próprio script faz o banimento. Mas preciso reduzir a carga do servidor, evitando a análise de php para ips indesejados conhecidos) em três dias, meu tráfego diminuiu de 5 GB por dia para 300 MB, o que é silencioso.

Verifique esta página também para obter a lista completa de regras do htaccess para bloquear muitos bots de lixo eletrônico conhecidos. http://www.askapache.com/htaccess/blocking-bad-bots-and-scrapers-with-htaccess.html

Nishad TR
fonte
0
// Checks to see if this script was called by the main site pages,
// (i.e. index.php or mobile.php) and if not, then sends to main page
session_start();  
if (isset($_SESSION['views'])) {$_SESSION['views'] = $_SESSION['views']+ 1;} else {$_SESSION['views'] = 1;}
if ($_SESSION['views'] > 1) {header("Location: http://website.com/index.php");}

Este script não faz o que o comentário diz, na verdade, faz o contrário. Isso sempre deixará os bots passarem, já que a variável da sessão nunca será definida quando o bot solicitar seu script. Tudo o que ele fará é impedir que solicitações legítimas (do index.php ou mobile.php) chamem o script mais de uma vez.

Para impedir que um bot acesse seu script, você só deve permitir o acesso se uma variável de sessão (ou cookie) estiver realmente definida. Supondo, é claro, que o bot (malicioso) não aceite cookies. (Sabemos que o verdadeiro Googlebot não.)

Como já foi mencionado, colocar rss2html.php acima da raiz da web (fora do espaço público) impediria que um bot acessasse o script diretamente - mas você diz que isso causa outros problemas? Ou, coloque-o em um diretório e proteja esse diretório com .htaccess. Ou você pode proteger o próprio arquivo no .htaccess de solicitações diretas?

Sr. White
fonte
0

Vá configurar seu domínio no Cloudflare (serviço gratuito para isso). Eles bloqueiam bots maliciosos no nível do domínio antes de atingirem o servidor. Demora cerca de 20 minutos, nunca precisa usar o código.

Eu uso este serviço em todos os meus sites e em todos os sites clientes. Eles identificam bots maliciosos com base em várias técnicas, incluindo a alavanca do projeto Honey pot.

Brett Bumeter
fonte
0

O que você precisa fazer é instalar um certificado SSL em seu servidor para apache / nginx / email / ftp. Ative o HSTS e também é necessário editar seu arquivo ssl.conf para que o SSLv2 SSLv3 TLSv1 seja desativado e não permita conexões de entrada. Fortaleça seu servidor da maneira certa e você não terá problemas com os bots.

Robert
fonte
Não está claro para mim que problema o SSL / TLS está resolvendo neste caso. Parece que você está implorando a pergunta e chegando ao resultado. Por favor, explique como esta solução controla o problema.