Portál AbcLinuxu, 1. května 2025 16:05
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
Tiskni
Sdílej:
gethostbyaddr(...)
?
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.
mod_rewrite:
Denying Hosts in a Blacklist
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.