Perlu Menghentikan Bot dari Membunuh Server Web saya

9

Saya mengalami masalah bot EXTREME di beberapa situs web saya dalam akun hosting saya. Bot menggunakan lebih dari 98% sumber daya CPU saya dan 99% dari bandwidth saya untuk seluruh akun hosting saya. Bot ini menghasilkan lebih dari 1 GB lalu lintas per jam untuk situs saya. Lalu lintas manusia nyata untuk semua situs ini kurang dari 100 MB / bulan .

Saya telah melakukan penelitian ekstensif pada file robots.txt dan .htaccess untuk memblokir bot ini tetapi semua metode gagal.

Saya juga telah meletakkan kode di file robots.txt untuk memblokir akses ke direktori skrip, tetapi bot ini (Google, MS Bing, dan Yahoo) mengabaikan aturan dan menjalankan skrip itu.

Saya tidak ingin sepenuhnya memblokir Google, MS Bing, dan bot Yahoo, tapi saya ingin membatasi laju perayapan di sana. Juga, menambahkan pernyataan Penelusuran-jeda di file robots.txt tidak memperlambat bot. Kode robots.txt dan .htacces saya saat ini untuk semua situs dinyatakan di bawah ini.

Saya telah menyiapkan alat webmaster Microsoft dan Google untuk memperlambat tingkat perayapan ke minimum absolut, tetapi mereka masih memukul situs-situs ini dengan kecepatan 10 hit / detik.

Selain itu, setiap kali saya mengunggah file yang menyebabkan kesalahan, seluruh server web VPS turun dalam hitungan detik sehingga saya bahkan tidak dapat mengakses situs memperbaiki masalah karena serangan hit oleh bot ini.

Apa yang dapat saya lakukan untuk menghentikan slot lalu lintas ke situs web saya?

Saya mencoba bertanya kepada perusahaan hosting web saya (site5.com) berkali-kali tentang masalah ini dalam beberapa bulan terakhir dan mereka tidak dapat membantu saya dengan masalah ini.

Yang benar-benar saya butuhkan adalah untuk mencegah Bot menjalankan skrip rss2html.php. Saya mencoba kedua sesi dan cookie dan keduanya gagal.

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

PEMBARUAN UNTUK MENUNJUKKAN KODE AGEN PENGGUNA TAMBAH BOT CHECK

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

Saya juga menambahkan yang berikut ini ke bagian atas skrip 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
sumber
Kapan Anda memperbarui robots.txt? Robot perlu waktu untuk membaca versi yang diperbarui.
ilanco
beberapa hari yang lalu. Yang benar-benar saya butuhkan adalah untuk mencegah Bot menjalankan skrip rss2html.php. Saya mencoba kedua sesi dan cookie dan keduanya gagal.
Bagaimana rss2html.phpcara digunakan oleh situs Anda? via PHP termasuk, redirect, Ajax ....?
cao
File rss2html.php dipanggil melalui perintah file_get_contents ()
file_get_contents...? Agak aneh. File ada di server lain atau sesuatu?
cHao

Jawaban:

3

Jika rss2html.phptidak digunakan secara langsung oleh klien (yaitu, jika itu PHP selalu menggunakannya daripada sebagai tautan atau semacamnya), maka lupakan mencoba memblokir bot. Yang harus Anda lakukan adalah menentukan konstanta atau sesuatu di halaman utama, lalu includeskrip lainnya. Di skrip lain, periksa apakah konstanta didefinisikan, dan keluarkan kesalahan 403 atau halaman kosong atau apa pun jika tidak didefinisikan.

Sekarang, agar ini berfungsi, Anda harus menggunakan includealih-alih file_get_contents, karena yang terakhir hanya akan membaca dalam file (jika Anda menggunakan jalur lokal), atau berjalan di seluruh proses lain (jika Anda ' sedang menggunakan URL). Tapi itu metode yang mirip Joomla! digunakan untuk mencegah agar skrip tidak dimasukkan secara langsung. Dan gunakan path file daripada URL, sehingga kode PHP belum diuraikan sebelum Anda mencoba menjalankannya.

Bahkan lebih baik untuk rss2html.phpkeluar dari bawah root dokumen, tetapi beberapa host membuat hal itu sulit dilakukan. Apakah itu pilihan tergantung pada pengaturan server / host Anda.

cao
sumber
1
Chao, terima kasih. Saat ini, saya menulis ulang kode saya untuk mengonversi file_get_contents untuk dimasukkan sebagai gantinya.
Sammy
4

Anda dapat mengatur skrip Anda untuk melemparkan kesalahan 404 berdasarkan string agen pengguna yang disediakan oleh bot - mereka akan dengan cepat mendapatkan petunjuk dan meninggalkan Anda sendirian.

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

Pilih log Anda dan tolak Bingbot, dll. Dengan cara yang serupa - itu tidak akan menghentikan permintaan, tetapi mungkin menghemat bandwidth - beri googlebot rasa obatnya sendiri - Mwhahahahaha!

Diperbarui

Melihat kode Anda, saya pikir masalah Anda ada di sini:

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

Jika mereka bot jahat maka mereka bisa datang dari mana saja, $ipaddresskeluarkan klausa itu dan berikan respons 301 atau 404 pada mereka.

Berpikir tepat di sisi kotak

  1. Googlebot tidak pernah menerima cookie , jadi tidak dapat menyimpannya. Bahkan, jika Anda memerlukan cookie untuk semua pengguna, itu mungkin akan membuat bot tidak mengakses halaman Anda.
  2. Googlebot tidak memahami bentuk - atau - javascript, sehingga Anda dapat membuat tautan secara dinamis atau meminta pengguna mengklik tombol untuk mencapai kode Anda (dengan token yang sesuai terpasang).

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

    • rss2html.php? divalidasi = 29e0-27fa12-fca4-cae3 - manusia
    • rss2html.php - bot
web_bod
sumber
1
Tidak secepat yang Anda pikirkan. Saya telah melihat bot mengenai halaman tidak ada yang sama selama berbulan-bulan, kadang-kadang bahkan bertahun-tahun setelah halaman dihapus. Tergantung pada seberapa baik kelakuan bot itu dan apa yang terjadi setelahnya.
cao
Cara kerjanya bagi pengunjung manusia adalah bahwa file index.php memanggil skrip rss2html.php. Bot menghindari skrip index.php dan langsung menjalankan skrip rss2html.php. Bagaimana saya bisa melindungi file rss2html.php jika tidak diakses melalui script index.php?
Coba ganti nama rss2html.php ke sesuatu yang lain dan perbarui index.php Anda untuk referensi nama baru.
BluesRockAddict
Saya mencoba mengubah nama file, tetapi gagal setelah beberapa hari. Bagaimana saya bisa menambahkan kode yang saya gunakan ke utas ini? Saya ingin menunjukkan kepada Anda apa yang telah saya coba.
1
ok - Saya tahu trik yang bisa Anda lakukan :) - letakkan kode skrip rss2html.php di luar situs web Anda (akan memperbarui jawaban)
2

Batas PHP / Blokir permintaan Situs Web untuk Spider / Bot / Klien, dll.

Di sini saya telah menulis fungsi PHP yang dapat Memblokir Permintaan yang tidak diinginkan untuk mengurangi Lalu Lintas Situs Web Anda. Baik untuk Laba-laba, Bot, dan Klien yang mengganggu.

CLIENT / Bots Blocker

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

KODE:

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

Kemungkinan situs Anda diindeks oleh bot google palsu. Anda dapat mencoba menambahkan tanda centang dan melayani 404 untuk semua permintaan google bot palsu.

Berikut adalah artikel yang menjelaskan cara memverifikasi Googlebot: http://googlewebmastercentral.blogspot.com/2006/09/how-to-verify-googlebot.html

Anda juga dapat memeriksa catatan Anda terhadap bot palsu yang diketahui: http://stopmalvertising.com/security/fake-google-bots.html

BluesRockAddict
sumber
Terima kasih, tetapi sebenarnya saya mencobanya juga, menentukan agen pengguna dan mengirim bot ke halaman login. Ini juga gagal.
Sepertinya Anda tidak mengerti intinya - mengandalkan agen pengguna untuk menentukan keaslian bot tidak cukup.
BluesRockAddict
1

Anda harus benar-benar memastikan bahwa setiap halaman yang diminta dari agen pengguna, dari perayap yang Anda miliki, akan disajikan sebagai halaman statis.

Sebuah mod_rewrite apache dengan kondisi atau equiv dengan server http Anda. Untuk apache, kira-kira seperti ini:

RewriteCond  %{HTTP_USER_AGENT}  ^GoogleBot [OR]
RewriteCond  %{HTTP_USER_AGENT}  ^OtherAbusiveBot
RewriteRule  ^/$                 /static_page_for_bots.html  [L]
smassey
sumber
terima kasih, tapi saya tidak ingin sepenuhnya memblokir Google, MS Bing, dan bot Yahoo, tapi saya ingin membatasi ada hit langsung pada file skrip rss2html.php. Saya hanya perlu menambahkan sesuatu ke awal skrip rss2html.php yang akan mencegahnya berjalan jika tidak diakses melalui skrip index.php. Bot saat ini menjalankan skrip rss2html.php melewati file index.php.
Sammy
Ini tidak memblokir mereka .. Anda hanya melayani versi cache dari php Anda .. ini sangat mudah untuk server todo, ini adalah contoh php kurang / satu proses apache anak lebih sedikit. => Biaya (file statis) <Biaya (contoh php).
smassey
bagaimana cara saya me-cache halaman? Karena halaman tersebut adalah RSS, apakah halaman yang di-cache cukup sering di-refresh untuk memberikan data segar?
Sammy
Tentu saja ... Tuliskan cronjob yang melakukannya untuk Anda. Jika Anda mengatakan mereka menekan server 10req / s jika Anda men-cache halaman untuk 1 menit Anda telah menyimpan server Anda 599 contoh php tambahan (yang tentu saja termasuk koneksi db / permintaan) .. Dan sekali satu menit lebih dari apa yang saya pilih untuk: 10/15 mnt.
smassey
1

Untuk melanjutkan posting smassey, Anda dapat menempatkan beberapa kondisi:

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

Dengan cara ini, bot masih mengakses halaman Anda, tetapi tidak hanya itu. Karena aneh bahwa bot (sah) tidak mematuhi aturan, apakah Anda memiliki referer yang mendorong bot ke halaman Anda dari sumber lain (penerusan nama domain, ...)

ndrix
sumber
1

Saya telah memecahkan masalah yang sama dengan skrip yang tersedia di http://perishablepress.com/blackhole-bad-bots/ . Dengan pendekatan lubang hitam ini saya mengumpulkan daftar ip berbahaya, dan kemudian menggunakan .htaccess menolaknya. (Yang tidak wajib, karena skrip itu sendiri yang melarang. Tapi saya perlu mengurangi beban server dengan menghindari parsing php untuk ips yang tidak diketahui yang dikenal) dalam tiga hari lalu lintas saya turun dari 5GB per hari menjadi 300MB, yang diharapkan tenang.

Periksa halaman ini juga untuk daftar lengkap aturan htaccess untuk memblokir banyak bot sampah yang dikenal. http://www.askapache.com/htaccess/blocking-bad-bots-and-scrapers-with-htaccess.html

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

Skrip ini tidak melakukan apa yang dikatakan komentar, bahkan sebaliknya. Ini akan selalu membiarkan bot lewat, karena variabel sesi tidak akan pernah ditetapkan ketika bot meminta skrip Anda. Yang berpotensi dilakukan adalah mencegah permintaan yang sah (dari index.php atau mobile.php) memanggil skrip lebih dari satu kali.

Untuk mencegah bot mengakses skrip Anda, Anda hanya boleh mengizinkan akses jika variabel sesi (atau cookie) benar-benar disetel. Dengan asumsi tentu saja bahwa bot (jahat) tidak menerima cookie. (Kami tahu bahwa Googlebot yang asli tidak.)

Seperti yang telah disebutkan, menempatkan rss2html.php di atas root web (di luar ruang publik) akan mencegah bot mengakses skrip secara langsung - tetapi Anda mengatakan ini menyebabkan masalah lain? Atau, letakkan di direktori dan lindungi direktori itu dengan .htaccess. Atau Anda bahkan mungkin dapat melindungi file itu sendiri di .htaccess dari permintaan langsung?

TuanWhite
sumber
0

Siapkan domain Anda di Cloudflare (layanan gratis untuk ini). Mereka memblokir bot jahat di tingkat domain sebelum memukul server Anda. Butuh waktu sekitar 20 menit, tidak perlu kera dengan kode.

Saya menggunakan layanan ini di semua situs saya dan semua situs klien. Mereka mengidentifikasi bot jahat berdasarkan sejumlah teknik termasuk meningkatkan proyek pot Madu.

Brett Bumeter
sumber
0

Yang perlu Anda lakukan adalah menginstal Sertifikat SSL di server Anda untuk apache / nginx / email / ftp. Aktifkan HSTS dan Anda juga perlu mengedit file ssl.conf Anda sehingga SSLv2 SSLv3 TLSv1 dinonaktifkan dan tidak memungkinkan koneksi masuk. Perkuat server Anda dengan cara yang benar dan Anda tidak akan mendapatkan masalah dari bot.

Robert
sumber
Tidak jelas bagi saya masalah apa yang dipecahkan SSL / TLS dalam kasus ini. Sepertinya Anda mengemis pertanyaan dan tiba di hasilnya. Tolong jelaskan bagaimana solusi ini mengendalikan masalah.