봇이 웹 서버를 종료하지 못하게해야 함


9

내 호스팅 계정 내 일부 웹 사이트에서 EXTREME 봇 문제가 발생했습니다. 봇은 전체 호스팅 계정에 98 % 이상의 CPU 리소스와 99 %의 대역폭을 사용합니다. 이 봇은 내 사이트에 대해 시간당 1GB 이상의 트래픽을 생성 합니다. 이러한 모든 사이트의 실제 인적 트래픽은 100MB / 월 미만 입니다.

이러한 봇을 차단하기 위해 robots.txt 및 .htaccess 파일 모두에 대한 광범위한 연구를 수행했지만 모든 방법이 실패했습니다.

또한 robots.txt 파일에 코드를 추가하여 스크립트 디렉토리에 대한 액세스를 차단했지만 이러한 봇 (Google, MS Bing 및 Yahoo)은 규칙을 무시하고 스크립트를 실행합니다.

Google, MS Bing 및 Yahoo 봇을 완전히 차단하고 싶지 않지만 크롤링 속도를 제한하고 싶습니다. 또한 robots.txt 파일에 Crawl-delay 문을 추가해도 봇 속도가 느려지지 않습니다. 모든 사이트에 대한 현재 robots.txt 및 .htacces 코드가 아래에 나와 있습니다.

크롤링 속도를 최소로 낮추도록 Microsoft 및 Google 웹 마스터 도구를 모두 설정했지만 여전히 10 초 / 초의 속도로이 사이트를 방문하고 있습니다.

또한 오류가 발생하는 파일을 업로드 할 때마다 전체 VPS 웹 서버가 몇 초 내에 다운되어 이러한 봇의 공격으로 사이트에 액세스 할 수없는 문제도 해결됩니다.

내 웹 사이트로 들어오는 트래픽을 막으려면 어떻게해야합니까?

지난 몇 달 동안 웹 호스팅 회사 (site5.com) 에이 문제에 대해 여러 번 문의했지만이 문제를 해결하는 데 도움이되지 않습니다.

내가 정말로 필요한 것은 봇이 rss2html.php 스크립트를 실행하지 못하게하는 것입니다. 세션과 쿠키를 모두 시도했지만 실패했습니다.

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

추가 된 사용자 에이전트 봇 체크 코드를 표시하도록 업데이트

<?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");
       }
     }
}
?>

또한 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");}

언제 업데이트 robots.txt했습니까? 로봇이 업데이트 된 버전을 읽는 데 시간이 걸릴 수 있습니다.
ilanco

며칠 전에 실제로 필요한 것은 봇이 rss2html.php 스크립트를 실행하지 못하게하는 것입니다. 세션과 쿠키를 모두 시도했지만 실패했습니다.

rss2html.php귀하의 사이트 는 어떻게 사용됩니까? PHP를 통해 포함, 리디렉션, Ajax ....?
cHao

rss2html.php 파일은 file_get_contents () 명령을 통해 호출됩니다

file_get_contents...? 다소 이상해 보인다. 파일이 다른 서버에 있습니까?
cHao

답변:


3

rss2html.php클라이언트가 직접 사용하지 않는 경우 (즉, PHP가 링크 또는 무언가가 아닌 항상 사용하는 경우) 봇을 차단하는 것을 잊지 마십시오. 메인 페이지에서 상수 또는 무언가를 정의한 다음 include다른 스크립트를 정의하기 만하면 됩니다. 다른 스크립트에서 상수가 정의되어 있는지 확인하고 403 오류 또는 빈 페이지 또는 정의되지 않은 경우를 뱉어냅니다.

이제 작업이 위해서는, 당신은 사용해야합니다 include보다는 file_get_contents(로컬 경로를 사용하는 경우) 후자는 하나 단지 파일을 읽을 것 같은, 또는 (완전히 다른 프로세스에서 실행 당신이 ' URL을 다시 사용). 그러나 그것은 Joomla와 같은 것들입니다! 스크립트가 직접 포함되지 않도록합니다. 그리고 URL 대신 파일 경로를 사용하여 PHP 코드를 실행하기 전에 파싱하지 않도록하십시오.

rss2html.php문서 루트 아래에서 나가는 것이 더 좋지만 일부 호스트는이를 어렵게 만듭니다. 옵션인지 여부는 서버 / 호스트 설정에 따라 다릅니다.


1
차오, 고마워 현재 file_get_contents를 대신 포함하도록 변환하기 위해 코드를 다시 작성 중입니다.
Sammy

4

봇이 제공 한 사용자 에이전트 문자열을 기반으로 404 오류를 발생 시키도록 스크립트를 설정할 수 있습니다. 빠르게 힌트를 얻고 당신을 내버려 둘 것입니다.

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

비슷한 방식으로 로그를 선택하고 Bingbot 등을 거부하십시오-요청을 멈추지 않지만 대역폭을 절약 할 수 있습니다-Googlebot에게 자신의 약을 맛보십시오-Mwhahahahaha!

업데이트

코드를 살펴보면 문제가 있다고 생각합니다.

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

악의적 인 봇이라면 어디에서나 나올 수 있으며, 해당 $ipaddress조항을 꺼내어 301 또는 404 응답을 던지십시오.

상자 옆에서 바로 생각

  1. Googlebot은 쿠키를 허용하지 않으므로 쿠키를 저장할 수 없습니다. 실제로 모든 사용자에게 쿠키가 필요한 경우 봇이 페이지에 액세스하지 못하게 될 수 있습니다.
  2. Googlebot은 양식 또는 자바 스크립트를 이해하지 못하므로 링크를 동적으로 생성하거나 사용자가 버튼을 클릭하여 코드에 도달하도록 할 수 있습니다 (적절한 토큰이 첨부 된 상태).

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

    • rss2html.php? validated = 29e0-27fa12-fca4-cae3-인간
    • rss2html.php-봇

1
생각만큼 빨리하지 않습니다. 봇이 존재하지 않는 동일한 페이지를 몇 달 동안, 때로는 페이지가 삭제 된 후 몇 년 동안 충돌하는 것을 보았습니다. 봇이 얼마나 잘 동작하고 무엇을했는지에 따라 다릅니다.
cHao

인간 방문자에게 효과적인 방법은 index.php 파일이 rss2html.php 스크립트를 호출하는 것입니다. 봇은 index.php 스크립트를 피하고 rss2html.php 스크립트를 직접 실행합니다. index.php 스크립트를 통해 rss2html.php 파일에 액세스 할 수없는 경우 어떻게 보호 할 수 있습니까?

rss2html.php의 이름을 다른 것으로 바꾸고 index.php를 업데이트하여 새로운 이름을 참조하십시오.
BluesRockAddict

파일 이름 바꾸기를 시도했지만 며칠 후에 실패합니다. 이 스레드에 사용중인 코드를 어떻게 추가 할 수 있습니까? 내가 시도한 것을 보여 드리고 싶습니다.

1
좋아-나는 당신이 뽑을 수있는 트릭을 알고있다 :)-rss2html.php 스크립트 코드를 귀하의 웹 사이트 외부에 넣으십시오 (답변을 업데이트 할 것입니다)

2

스파이더 / 봇 / 클라이언트 등에 대한 PHP 제한 / 차단 웹 사이트 요청

여기에 원치 않는 요청을 차단하여 웹 사이트 트래픽을 줄일 수있는 PHP 기능을 작성했습니다. 거미, 봇 및 성가신 고객에게 좋습니다.

클라이언트 / 봇 차단기

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

암호:

/* 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!";
}

1

귀하의 사이트가 가짜 Google 봇에 의해 색인이 생성되었을 수 있습니다. 수표를 추가하여 모든 가짜 Google 봇 요청에 대해 404를 제공 할 수 있습니다.

다음은 Googlebot을 확인하는 방법을 설명하는 기사입니다. http://googlewebmastercentral.blogspot.com/2006/09/how-to-verify-googlebot.html

또한 알려진 가짜 봇에 대해 기록을 확인할 수 있습니다. http://stopmalvertising.com/security/fake-google-bots.html


고마워하지만 실제로는 사용자 에이전트를 결정하고 봇을 로그인 페이지로 보내는 것도 시도했습니다. 이것도 실패했습니다.

봇 신뢰성을 판단하기 위해 사용자 에이전트에 의존하는 것만으로는 충분하지 않습니다.
BluesRockAddict

1

사용자 에이전트에서 요청한 페이지 중 어느 것이 든 크롤러가 크지 않은 페이지에 정적 페이지가 표시되도록해야합니다.

http 서버와 조건 또는 equiv를 가진 아파치 mod_rewrite. 아파치의 경우 다음과 같습니다.

RewriteCond  %{HTTP_USER_AGENT}  ^GoogleBot [OR]
RewriteCond  %{HTTP_USER_AGENT}  ^OtherAbusiveBot
RewriteRule  ^/$                 /static_page_for_bots.html  [L]

고맙지 만 Google, MS Bing 및 Yahoo 봇을 완전히 차단하고 싶지는 않지만 rss2html.php 스크립트 파일에서 직접 적중을 제한하고 싶습니다. rss2html.php 스크립트의 시작 부분에 무언가를 추가하면 index.php 스크립트를 통해 액세스하지 않으면 스크립트가 실행되지 않습니다. 봇은 현재 index.php 파일을 무시하고 rss2html.php 스크립트를 실행하고 있습니다.
Sammy

이것은 그들을 차단하지 않습니다. 당신은 단순히 당신의 php의 캐시 된 버전을 제공합니다. 이것은 서버가 할 일이 매우 쉽습니다. 하나의 PHP 인스턴스 / 아파치 자식 프로세스가 적습니다. => 비용 (정적 파일) <비용 (php 인스턴스).
smassey

페이지를 어떻게 캐시합니까? 페이지가 RSS이므로 캐시 된 페이지가 새로운 데이터를 제공 할 정도로 자주 새로 고쳐 집니까?
Sammy

물론 ... 당신을 위해 그것을하는 cronjob을 작성하십시오. 1 분 동안 페이지를 캐시하면 서버 10req / s에 도달했다면 서버 599 개의 추가 PHP 인스턴스 (확실히 db 연결 / 쿼리 포함)를 저장 한 것입니다. 10 분 / 15 분
smassey

1

smassey의 게시물을 계속하려면 몇 가지 조건을 지정할 수 있습니다.

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

이 방법으로 봇은 여전히 ​​귀하의 페이지에 액세스하지만 해당 페이지에는 액세스하지 않습니다. (합법적 인) 봇이 규칙을 지키지 않는 것이 이상하기 때문에 다른 소스 (도메인 이름 전달 등)에서 봇을 페이지로 푸시하는 참조자가 있습니까?


1

http://perishablepress.com/blackhole-bad-bots/ 에서 사용 가능한 스크립트로 동일한 문제를 해결했습니다 . 이 블랙홀 접근 방식으로 악성 IP 목록을 수집 한 다음 .htaccess를 사용하여 거부했습니다. (스크립트 자체가 금지되기 때문에 필수는 아니지만, 알려진 원치 않는 IP에 대한 PHP 구문 분석을 피하여 서버로드를 줄여야합니다.) 3 일 동안 트래픽이 하루 5GB에서 300MB로 줄어든 것으로 예상됩니다.

알려진 많은 정크 봇을 차단하는 htaccess 규칙의 전체 목록도이 페이지에서 확인하십시오. http://www.askapache.com/htaccess/blocking-bad-bots-and-scrapers-with-htaccess.html


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

이 스크립트는 주석의 내용을 수행하지 않으며 실제로는 완전히 반대입니다. 이 것 항상 봇이 스크립트를 요청할 때 세션 변수가 설정되지 않습니다 때문에,를 통해 봇을 할 수 있습니다. 합법적 인 요청 (index.php 또는 mobile.php의 요청)이 스크립트를 두 번 이상 호출하지 못하도록 방지하는 것입니다.

봇이 스크립트에 액세스하지 못하게하려면 세션 변수 (또는 쿠키)가 실제로 설정된 경우에만 액세스를 허용해야합니다. 물론 (악의적 인) 봇은 쿠키를 허용하지 않는다고 가정합니다. 실제 Googlebot은 그렇지 않습니다.

이미 언급했듯이 rss2html.php를 웹 루트 (공개 웹 공간 외부) 위에 배치하면 봇이 스크립트에 직접 액세스하지 못하게되지만 다른 문제가 발생한다고 말합니까? 또는 디렉토리에 넣고 .htaccess로 해당 디렉토리를 보호하십시오. 또는 직접 요청으로부터 .htaccess의 파일 자체 만 보호 할 수도 있습니까?


0

Cloudflare에서 도메인을 설정하십시오 (무료 서비스). 서버에 도달하기 전에 도메인 수준에서 악성 봇을 차단합니다. 약 20 분이 걸리며 코드를 가지고 원숭이를 타지 않아도됩니다.

이 서비스는 모든 사이트 및 모든 클라이언트 사이트에서 사용합니다. 그들은 프로젝트 허니 팟 활용을 포함하여 많은 기술을 기반으로 악성 봇을 식별합니다.


0

apache / nginx / email / ftp를 위해 SSL 인증서를 서버에 설치하면됩니다. HSTS를 활성화하고 SSLv2 SSLv3 TLSv1이 비활성화되고 들어오는 연결을 허용하지 않도록 ssl.conf 파일을 편집해야합니다. 올바른 방법으로 서버를 강화하면 봇에서 아무런 문제가 없습니다.


이 경우 SSL / TLS가 어떤 문제를 해결하고 있는지 분명하지 않습니다. 질문을 간청하고 결과에 도달 한 것 같습니다. 이 솔루션이 문제를 어떻게 제어하는지 설명하십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.