Ako na IP Bloker pre Vaše stránky: časť 1

Rasťo Turek  /  11. 05. 2004, 00:00

Vítam Vás pri ďalšej časti seriálu „Ako na“. Dnes sa pozrieme na jednoduchý skript, ktorý dokáže ukladať IP adresu návštevníka a pomocou jednoduchého admina aj blokovať/povoľovať IP adresu. Nápad na tento skript mi vnukol pán Jozef Tkáčik, za čo mu ďakujem a naďalej Vás žiadam, aby ste písali nápady alebo vlastné problémy s témami, ktoré by mohli byť zaujímavé nielen pre Vás.

Popis aplikácie
Aplikácia musí pozostávať z dvoch skriptov, a to z jedného, ktorý IP adresu získa a zapíše a druhého, ktorý zistí, či je IP adresa zablokovaná, alebo nie. My si teda vytvoríme dve funkcie. Ďalej potrebujeme skript na pripojenie k databáze. Tento skript som už rozoberal v predošlých dieloch, takže ho dnes rozoberať nebudem. Ďalej je pre nás dosť dôležité si vytvoriť admina, ktorý dokáže zobraziť všetky IP adresy a bude môcť pracovať s údajmi v databáze. Teda potrebujeme tri základné úkony: zmazať záznam, zablokovať IP adresu a odblokovať IP adresu. Aby nám na stránke nevznikol výpis dlhý až do Kanady :-), budeme si zapisovať pri rovnakých IP adresách len počet prístupov a dátum a čas posledného prístupu.

Návrh aplikácie
Aplikácia bude mať štyri súbory. Prvým bude samozrejme index.php, kde si zavoláme funkcie na zápis a na blokovanie IP adresy, ďalej si pripravíme súbor funkcie.php, kde si nadefinujeme obe funkcie pre zistenie a následné zapísanie IP adresy návštevníka do mysql databázi a samozrejme aj funkcie na zablokovanie/odblokovanie IP adresy. No posledným dôležitým súborom je admin.php. Tu si môžete po zadaní mena a hesla zistiť, z akých IP adries sa k Vám návštevníci pripájajú a následne si môžete vybrať, či chcete tú ktorú zablokovať/odblokovať alebo vymazať. Štvrtým súborom je len skript na pripojenie k databázi a ten úž poznáte z predošlých článkov a nazveme si ho config.php. Aplikácia je navrhnutá tak, aby ste do stránky museli pripájať tri riadky, aby ste nemuseli meniť svoje hotové stránky. Takže poďme si pomaličky rozobrať všetky skripty podľa dôležitosti.

Začíname
V prvom rade si navrhneme databázu. Vytvoríme si tabuľku s názvom ip. V tabuľke potrebujeme stĺpce id, ip, datum, zablokovanie, pristupov. Stĺpec id budeme využívať na určenie v tabuľke, ip na zápis adresy ip, datum na zápis dátumu a času posledného prístupu na stránky, zablokovanie pre zablokovanie/odblokovanie ip adresy a nakoniec počet prístupov z jednotlivých ip adries. Takže prakticky bude návrh SQL tabuľky ip takýto:

CREATE TABLE ip (
  id int(8) NOT NULL auto_increment,
  ip varchar(50) NOT NULL default '',
  datum datetime NOT NULL default '0000-00-00 00:00:00',
  zablokovane char(3) NOT NULL default 'nie',
  pristupov int(10) NOT NULL default '0',
  PRIMARY KEY  (id)
) TYPE=MyISAM;

Myslím že už nie je potrebné vysvetľovať návrh tejto tabuľky. Ďalej si zapíšeme skript pre pripojenie k mysql a nazveme si ho config.php:

<?php
if (!@$spojenie = MySQL_Connect("localhost", "meno", "heslo")):
 echo "Nepodarilo sa pripojit k databazi!";
 die;
endif;
if (!@$select = MySQL_Select_Db("databaza")):
 echo "Chyba pri vybere databaze!";
 die;
endif;
?>

Keď už máme navrhnutú tabuľku, môžeme pristúpiť k návrhu funkcií pre načítanie/zapísanie IP adresy a bloker IP.

Poznámka: Keďže v diskusii viackrát zazneli požiadavky, aby som skripty písal pre register_globals=Off, tak teraz nájdete všetky skripty upravené do tejto podoby! Budú funkčné na verzii php 4.0.0 a vyššej.

Funkcia na zistenie/zapísanie IP adresy
Najskôr Vám celú funkciu predostriem tak, ako bude vyzerať vo finálnej podobe a potom si ju spolu prejdeme.

// vytvoríme si funkciu na zapísanie ip adresy návštevníka
function write_ip($ip)
{
 // vytvoríme si požiadavku na mysql aby nám vyhľadala ip adresu ak taká už existuje
 $sql = mysql_query("SELECT * FROM ip WHERE ip LIKE \"$ip\"");
 // nadefinujeme si dátum a čas pre posledné prihlásenie
 $date = date("Y-m-d H:i:s");
 // zistíme koľko záznamov už máme v databázi (použijeme pre vytvorenie podmienky)
 $wo  = mysql_num_rows($sql);
 // vytiahneme si jeden riadok z databázi
 $zaznam = mysql_fetch_object($sql);

 // vytvoríme si podmienku, ak je riadkov viac ako 0
 if($wo>0)
 {
  // upravíme riadok a doplníme ho prístupov + 1 a doplníme nový dátum
  Mysql_Query("UPDATE ip SET pristupov=$zaznam->pristupov + 1, datum='$date' WHERE id='$zaznam->id'");
 }
 else
 {
  // ak je počet vrátených riadkov rovných nule, doplníme nový riadok do databázi
  Mysql_Query("INSERT INTO ip VALUES ('', '$ip', '$date', 'nie', '1')");
 }
}

Ak ste si prezreli celú funkciu podrobne od začiatku až do konca, nemal by byť pre Vás najmenší problém ju pochopiť. Do funkcie s názvom write_ip musíme pre zavolanie vložiť IP adresu návštevníka. Ďalej si vytvoríme požiadavku na mysql, aby nám hľadalo IP adresu v tabuľke, nadefinujeme si dátum a čas posledného prihlásenia návštevníka stránok. Aby sme si mohli vytvoriť podmienku, ktorá bude rozhodovať, či vytvoriť nový riadok v tabuľke, alebo zapísať už do existujúceho riadku, musíme si načítať počet vrátených riadkov v tabuľke. Je jasné, že u nás nemôže vzniknúť viac ako jeden riadok s jednou IP adresou, keďže zapisujeme k už existujúcej IP-čke len počet prístupov. No a nakoniec si vytiahneme dáta, aby sme ich mohli zapisovať. Ako som už spomínal, vytvoríme si podmienku na zistenie, koľko riadkov nám požiadavka vrátila. Ak je riadkov viac ako nula, teda jeden, tak ho upravíme a to spôsobom, že prístupy zvýšime o jedna a dátum prepíšeme aktuálnym dátumom a časom. Nemeníme však vlastnosti blokovania IP adresy, aby sa nestalo, že by sa dotyčný automaticky pri ďalšej návšteve odblokoval. Ak je vrátený počet riadkov rovný nule, zapíšeme si nový riadok do tabuľky, a to tak, že určíme všetko okrem stĺpca id. Teraz už máme kompletný skript na zapisovanie zisťovanie/zapisovanie IP adresy. Myslím, že táto časť by Vám mala byť úplne jasná, keďže je to dosť jednoduché.
Teraz sa pozrieme na funkciu, ktorá bude vedieť zablokovať aktuálnu IP adresu, ktorú si určíme.

Bloker IP adresy
Ako pred chvíľkou si opäť zobrazíme celú funkciu a potom si ju vysvetlíme.

$sprava= "Vaša IP adresa bola zablokovaná. Prosím kontaktujte administrátora!";
// vytvoríme si funkciu na zablokovanie ip adresy
function blok_ip($ip)
{
 // vytvoríme si požiadavku na mysql aby nám vyhľadala ip adresu ak taká už existuje
 $sql = mysql_query("SELECT * FROM ip WHERE ip LIKE \"$ip\"");
 // vytiahneme si jeden riadok z databázi
 $zaznam = mysql_fetch_object($sql);
 // jednoduchou podmienkou zistíme, či k je táto ipčka zablokovaná
 if($zaznam->zablokovane=="ano")
 {
 //  a ak je tak ešte návštevníkovi vypíšeme text o tom, že má zablokovanú ip adresu
  echo $sprava;
  // a následne ukončíme skript
  exit;
 }
}

Funkcii block_ip musíme rovnako ako predošlej zadať IP adresu návštevníka, aby sme s ňou následne mohli pracovať. Rovnako ako predtým si vytvoríme požiadavku na mysql na vyhľadanie zadanej IP adresy. Tentoraz už nepotrebujeme nič zapisovať, teda si len vytiahneme vrátené dáta a konkrétne nás zaujíma len to, či je IP adresa zablokovaná alebo nie. Takže si vytvoríme podmienku na overenie zablokovanej IP adresy. Teda ak stĺpec zablokovane má hodnotu áno, ukončíme prevádzanie všetkých ďalších skriptov a načítavanie stránky zastavíme. Ešte pred tým však vypíšeme správu používateľovi, aby si nemyslel, že stránky nie sú v prevádzke, alebo aby sám nehľadal chybu v pripojení.

Na dnes je to všetko. Nabudúce sa pozrieme na administračný skript a samozrejme, že Vám dám celý príklad na stiahnutie. Dúfam, že táto časť bola dostatočne jednoduchá a že sa Vám skript páči. Ešte raz Vás chcem požiadať, aby ste mi písali svoje problémy s programovaním v php, poprípade vhodné podnety na články. Rád Vám však pomôžem aj mimo stránok www.inet.sk a teda môžete sa na mňa obracať aj s osobnými problémami v programovaní. Píšte na maily support@lammer.sk alebo turek@inet.sk.

Rastislav Turek // lammer.sk

Neprehliadnite: