Portál AbcLinuxu, 1. května 2025 16:05

Blacklist pro php

17.9.2012 14:17 | Přečteno: 918× | Jen tak na okraj

Je tomu půl roku, co jsem zde psal blogpost na téma zabezpečení mediawiki. Dlouhou dobu byl klid, ale v průběhu léta se objevily první vlaštovky, které si našly dírku a začaly se do naší mediawiki nabourávat zneužíváním stránek starých, již neaktualizovaných, webů. Nezbylo než pořešit situaci jinak - radikálněji.

Napsal jsem si tedy malou php funkci, která zařízne další zpracování php skriptu, pokud jde klienta ze "zakázané" domény či adresy. Funguje zcela stupidně, ale spolehlivě. Přes nslookup se zjistí pro IP klienta doména, která se pak ověří proti seznamu zakázaných adres a domén. Nemá-li klient doménu, pouze IP, tak se ověřuje IP adresa.

function testRemoteClientAddr($ip) {
    if(!empty($ip)) {
        exec("nslookup -type=MX ".$ip." | grep -E -m1 'in-addr.arpa|ip6.arpa'" , $result);
        $dnszaznam = explode(" ", $result[0]);
        //print_r($dnszaznam);
        if ($dnszaznam[0] == '**') {
            $zaznam = $ip;
        } else {
            $zaznam = $dnszaznam[count($dnszaznam) - 1];
        }
        $blacklist = '/etc/blacklist';
        if (is_file($blacklist)) {
            $denyhost = file($blacklist);
            $n = 0;
            while (count($denyhost) > $n) {
                if (stristr($zaznam, trim($denyhost[$n]).'.')) {
                    return false;
                    } 
                elseif ( $zaznam == trim($denyhost[$n]) ) {
                    return false;
                    }
                elseif (strstr($zaznam, trim($denyhost[$n]))) {
                    return false;
                    }
                $n++;
                }
            }
        }
        return true;
    }

if (testRemoteClientAddr($_SERVER['REMOTE_ADDR']) == false) {
    exit();
    }

Funkce není nijak vázaná na mediawiki a lze ji tak použít na libovolné php stránce. Obsah souboru /etc/blacklist je jednoduchý. Následující kousek obsahu uvádím jen pro ilustraci..

.skynetlink.com
2001:4ba0:fff9:178::2
.teda.net
iasi.fiberlink.ro
       

Hodnocení: 20 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

17.9.2012 14:43 loki
Rozbalit Rozbalit vše Re: Blacklist pro php
Odpovědět | Sbalit | Link | Blokovat | Admin
gethostbyaddr(...) ?
17.9.2012 16:19 misch | skóre: 3
Rozbalit Rozbalit vše Re: Blacklist pro php
Odpovědět | Sbalit | Link | Blokovat | Admin
to bude rychlost, dotaz na DNS při každém přístupu ...
17.9.2012 19:03 Aleš Kapica | skóre: 52 | blog: kenyho_stesky | Ostrava
Rozbalit Rozbalit vše Re: Blacklist pro php
Neřekl bych, že je to nějaká tragédie.
17.9.2012 22:08 sigma
Rozbalit Rozbalit vše Re: Blacklist pro php
To už bude horší ten exec / nslookup, navrch ještě s rourou na grep. Na každé zobrazení stránky to znamená spuštění 2 procesů. Horší než kdyby to celé jelo přes CGI (i když teda inicializace PHP bude stát víc než nslookup+grep). Ale pro tuhle potřebu to asi nemusí až tak vadit.
17.9.2012 20:38 petr_p | skóre: 59 | blog: pb
Rozbalit Rozbalit vše Re: Blacklist pro php
Odpovědět | Sbalit | Link | Blokovat | Admin
Za mých mladých let se používal /etc/hosts.deny.
17.9.2012 21:26 Aleš Kapica | skóre: 52 | blog: kenyho_stesky | Ostrava
Rozbalit Rozbalit vše Re: Blacklist pro php
Ten používám taky, ale v případě webu to nemá ten odpovídající efekt.
Petr Tomášek avatar 18.9.2012 08:03 Petr Tomášek | skóre: 39 | blog: Vejšplechty
Rozbalit Rozbalit vše Re: Blacklist pro php
multicult.fm | monokultura je zlo | welcome refugees!
18.9.2012 08:57 Aleš Kapica | skóre: 52 | blog: kenyho_stesky | Ostrava
Rozbalit Rozbalit vše Re: Blacklist pro php
I tohle jsem zkoušel. V takovém případě útočník záhy zjistil, že je doména blokovaná a začal to zkoušet odjinud. Řešení, které jsem použil má tu výhodu, že klient, který leze z blokované domény není serverem odmítnut, "jenom" se přestane zpracovávat skript. Takže sice dál buší jak hluchý do vrat, ale server to zatěžuje minimálně, protože mu vrací stránku z cache.
18.9.2012 13:51 Roman DAVID | skóre: 24 | Brno
Rozbalit Rozbalit vše Re: Blacklist pro php
Odpovědět | Sbalit | Link | Blokovat | Admin
Zkuste mod_security do Apache. Mozna to bude lepsi nez to resit v PHP.
18.9.2012 17:33 volvox | skóre: 16
Rozbalit Rozbalit vše Re: Blacklist pro php
Odpovědět | Sbalit | Link | Blokovat | Admin
No, přijde mi, že se pokoušíte vynalést kolo - sice trochu šišaté, zato vlastní ;)

Já na tot s úspěchem používám mod_rewrite: Denying Hosts in a Blacklist
rADOn avatar 18.9.2012 17:46 rADOn | skóre: 44 | blog: bloK | Praha
Rozbalit Rozbalit vše Re: Blacklist pro php
Odpovědět | Sbalit | Link | Blokovat | Admin
Tohle by mělo být někde vystavený pro poučení generací budoucích. Jako odstrašující příklad.
"2^24 comments ought to be enough for anyone" -- CmdrTaco
18.9.2012 17:53 loki
Rozbalit Rozbalit vše Re: Blacklist pro php
Je to funkcni reseni daneho problemu. Jiste by to slo udelat jinak, ale kdyz to autorovi takto vyhovuje, tak proc ne...
rADOn avatar 19.9.2012 14:51 rADOn | skóre: 44 | blog: bloK | Praha
Rozbalit Rozbalit vše Re: Blacklist pro php
Spawnovat tri procesy kvuli necemu na co je v php zabudovana funkce? Kterazto neni uplne nutna, pacz staci zapnout lookupy v apacovi a dostane to pekne pod nos v $_SERVER['REMOTE_HOST'].

Ja kdybych takovehle "funkcni reseni" udelal v praci tak me vybědujou.
"2^24 comments ought to be enough for anyone" -- CmdrTaco
19.9.2012 23:12 CH
Rozbalit Rozbalit vše Re: Blacklist pro php
+1

Ale na druhou stranu to zda se funguje a to je to podstatne, zbytek nikoho nijak zvlast nezajima ... ale radsi proboha verejne neukazovat. :)

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.