SearchEngines.bg

Това е примерно съобщение за гост. Регистрирайте безплатен акаунт днес, за да станете потребител на SearchEngines.bg! След като влезете, ще можете да участвате в този сайт, като добавите свои собствени теми и публикации, както и да се свържете с други членове чрез вашата лична входяща кутия! Благодарим ви!

Блокиране на IP след определен брой 404 грешки?

scoobydoo

Know you can!
Здравейте.

Възможно ли да се направи скрипт, който да блокира автоматично IP след като е посетило примерно 10 пъти последователно все несъществуващи адреси (с грешка 404)? Примерно скрипта да добавя в htaccess файла един ред deny from xx.xx.xx.xx.

И ако да, това на какъв език се прави и някой знае ли такъв готов скрипт?

На споделен линукс хостинг съм, ако има значение.
 
Re: Блокиране на IP след определен брой 404 грешки?

Малко омотано решение, но си мисля, че лесно би могло да стане, ако направиш един малък трак скрипт, който да запазва IP и съответно броя опити на отваряне на страницата за това IP. При 10 опита да добавя реда в .htaccess файл-а и в допълнение един crontab да чисти DB таблицата всяка вечер... естествено малко примитивно решение, но смятам, че ще ти свърши работа.

Може да го направиш вместо към дб да добавя и сравнява от файл за да избегнеш заявки към MySQL.
 
За: Блокиране на IP след определен брой 404 грешки?

За: Блокиране на IP след определен брой 404 грешки?

Всеки log рийдър написан на perl или python ще ти свърши работа, но ще е със закъснение. Т.е. докато приеме реакция въпросното IP ще е навъртяло много повече от 10 реда в лога с 404. Според мен php скрипт, към който да насочваш обработката на 404 грешките ще е най-доброто решение. И съхранявай тези IP-та в таблица в базата данни, а не във файл.
 
За: Блокиране на IP след определен брой 404 грешки?

За: Блокиране на IP след определен брой 404 грешки?

Всеки log рийдър написан на perl или python ще ти свърши работа, но ще е със закъснение. Т.е. докато приеме реакция въпросното IP ще е навъртяло много повече от 10 реда в лога с 404. Според мен php скрипт, към който да насочваш обработката на 404 грешките ще е най-доброто решение. И съхранявай тези IP-та в таблица в базата данни, а не във файл.

Тоест с 404.php файл ще стане така ли? Това мога да го направя. Може да е малко тъп въпрос, но ботовете ако ударят на 404 задължително ли минават през 404.php файла (при положение че е оказан в htaccess файла така: ErrorDocument 404 /404.php)?
 
За: Блокиране на IP след определен брой 404 грешки?

За: Блокиране на IP след определен брой 404 грешки?

еми те ботовете минават през каквото им даде сървъра а с .htaccess ти говориш на сървъра, а не на бота

в допълнение към горните .. някъде е хубаво да пазиш и баннатите IP-та за по-лесна употреба после
 
За: Блокиране на IP след определен брой 404 грешки?

За: Блокиране на IP след определен брой 404 грешки?

Благодаря на всички. Щом мога да ги хвана през 404 файла с PHP значи ще се справя вече.
Поздрави.
 
За: Блокиране на IP след определен брой 404 грешки?

За: Блокиране на IP след определен брой 404 грешки?

Скуби, пак ще предложа своя любим блокер. В него си има специална секция за агресивни ботове - като вземе да блъска по няколко пъти в секунда, задейства променливата "хеви хит" и получава незабавен бан с хедър 503, все едно, че сървърът за него е спрял. После освен да си върви, друго не му остава, защото банът е вовеки веков. Амин!
Освен това не е изключено ботът, който те тормози, да се намира в черния списък и да бъде блокиран още с идването си.
Не те кандърдисвам, ако искаш, виж този адрес - http://wasteland-bg.com/phpbb2/forum71.html
Ето и сравнително пресен пример:
#: 72548 @: Mon, 06 May 2013 06:46:27 +0300 Running: 0.4.10a3 / 74a
Host: 186-227-192-103.static.dimenoc.com
IP: 186.227.192.103
Score: 4
Violation count: 1 INSTA-BANNED
Why blocked: Bad UA (UA-0137). Host caught trying to **** (HN-0117). Fake UA. Fake UA. Heavy hit. INSTA-BAN. Heavy hit. INSTA-BAN. You have been instantly banned due to extremely hazardous behavior!
Query:
Referer: http:// xxxxxx.com /
User Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows XP)
Reconstructed URL: http:// xxxxxx.com /
Задействали са се 4 различни дефиниции (Score: 4), по които е блокиран, но Heavy hit има приоритет и го блокира моментално без да чака още опити.
 
За: Блокиране на IP след определен брой 404 грешки?

За: Блокиране на IP след определен брой 404 грешки?

404.php не прави разлика между редови потребител, програма за изреждане на определени dorks или бот на търсачка, на който му е подадена неадекватен sitemap. Много внимавай да не си отрежеш google/bing клона на който седиш. Не знам каква е идеята на цялото начинание, но определени блокиране след 404 е много рисков метод.
 
За: Блокиране на IP след определен брой 404 грешки?

За: Блокиране на IP след определен брой 404 грешки?

@diabolic.bg
Мерси за предложението, но смятам да пропусна за момента.

@s1yf0x
Дам, ще имам предвид. Ще видим как ще го измисля точно.
 
Re: За: Блокиране на IP след определен брой 404 грешки?

Re: За: Блокиране на IP след определен брой 404 грешки?

404.php не прави разлика между редови потребител, програма за изреждане на определени dorks или бот на търсачка, на който му е подадена неадекватен sitemap. Много внимавай да не си отрежеш google/bing клона на който седиш. Не знам каква е идеята на цялото начинание, но определени блокиране след 404 е много рисков метод.

Предполагам идеята е да избегне ботове/екплойти, който пробват разни URL адреси. Поне аз мислих за подобен вариант когато имах подобни проблеми с един англоезичен сайт.
 
За: Re: За: Блокиране на IP след определен брой 404 грешки?

За: Re: За: Блокиране на IP след определен брой 404 грешки?

Предполагам идеята е да избегне ботове/екплойти, който пробват разни URL адреси. Поне аз мислих за подобен вариант когато имах подобни проблеми с един англоезичен сайт.

Така е, разни китайски ботове опитват да налучкат по няколко несъществуващи адреса в секунда и споделения ми хост направо издъхва...
 
За: Блокиране на IP след определен брой 404 грешки?

За: Блокиране на IP след определен брой 404 грешки?

Тогава използването на php скрипт за обработката на подобен трафик ще увеличи процесорното време многократно. Сваляй логовете на всеки 24 часа, филтрирай ги и добавяй ръчно в .htaccess. Това е единственото решение което няма да се отрази на CPU времето и ще блокира трафика преди да е стигнал до php.
 
За: Блокиране на IP след определен брой 404 грешки?

За: Блокиране на IP след определен брой 404 грешки?

Аз ползвам една модификация на този скрипт

PHP:
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.

        */

        $dir = 'requestBlocker/'; ## Create & set directory writeable!!!!

        $rules   = array(
                #You can add multiple Rules in a array like this one here
                #Notice that large "sec definitions" (like 60*60*60) will **** 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 does 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) {
                        $left = $time - $timestampPast;
                        if (($left) > $rules[$ruleNr]['blockTime']) {
                                unset($client['block'][$ruleNr]);
                                continue;
                        }
                        $blockIt[] = 'Block active for Rule: ' . $ruleNr . ' - unlock in ' . ($left - $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] = '';
                $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!";
}
Демо
 
Re: За: Блокиране на IP след определен брой 404 грешки?

Re: За: Блокиране на IP след определен брой 404 грешки?

Тогава използването на php скрипт за обработката на подобен трафик ще увеличи процесорното време многократно. Сваляй логовете на всеки 24 часа, филтрирай ги и добавяй ръчно в .htaccess. Това е единственото решение което няма да се отрази на CPU времето и ще блокира трафика преди да е стигнал до php.

Всъщност като се замисля аз тогава по подобен начин се отървах от ботовете. През .htaccess добавих при заявка на определените адреси да насочва към php скрипт, който добавяше deny from x.x.x.x и така ги ограничих.
 
За: Блокиране на IP след определен брой 404 грешки?

За: Блокиране на IP след определен брой 404 грешки?

Ами аз ръчно ги блокирам когато ги открия, ама не мога да реагирам светкавично. За това мисля да пробвам автоматично.
 
За: Блокиране на IP след определен брой 404 грешки?

За: Блокиране на IP след определен брой 404 грешки?

Явно не се изразих правилно:

Цел на упражнението: да ограничи трафика за да намали CPU потребиелнието
Резултат от автоматизирането с php: намаляване на трафика но увеличаване на CPU потреблението поради изпълнението на допълнителен php скрипт.
 
За: Блокиране на IP след определен брой 404 грешки?

За: Блокиране на IP след определен брой 404 грешки?

Всъщност на мен проблема ми е по-точно броя на процесите.
Това cpu потребление дето ще се увеличи няма ли да е само временно, докато скрипта не блокира IP-то. А и то ще е само при 404 грешка, тоест няма да се отрази на нормалния трафик, а само когато има атака от такъв бот.
 

Горе