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

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

V minulej časti sme si prebrali obe funkcie potrebné pre zistenie/zapísanie a zablokovanie IP adresy návštevníka Vašich stránok. Dnes sa pozrieme na skript admina a samozrejme aj index stránok. Nakoniec Vám ponúknem celý skript na stiahnutie.

Skript Admina
Táto časť je prakticky alfou a omegou celej aplikácie. Keďže sa tu budú nastavovať citlivé údaje, je celý skript chránený menom a heslom admina. Skript pozostáva z troch častí podmienky. Najskôr si zobrazíme celý skript a potom si to celé vysvetlíme.

<?php
// pripojíme konfiguračný skript na pripojenie k databáze
include("config.php");

// nadefinuje si meno a heslo pre admina
$meno  = "meno"; // meno (login)
$heslo = "heslo"; // heslo (password)

// vytvoríme si podmienku pre overenie mena a hesla, ak je správna len jedna z položiek nepovolíme vstup
if($_POST['meno']==$meno && $_POST['heslo']==$heslo)
{
 // vytvoríme si požiadavku pre mysql aby načítala dáta z tabuľky ip
 $sql = mysql_query("SELECT * FROM ip");

 // vypíšeme do stránky tabuľku
 echo "<table border=\"1\">";
 // a samozrejme určíme hlavičku, aby sme vedeli čo čo znamená
 echo "<tr align=\"center\"><td><strong>Id</strong></td><td><strong>Ip adresa</strong></td><td><strong>Posledný prístup</strong></td><td><strong>Prístupov</strong></td><td><strong>
Zablokované</strong></td><td><strong>Zablokuj</strong></td><td><strong>
Zmaž</strong></td></tr>";
 // začneme prehľadávať celú tabuľku aby sme si mohli vypísať do stránky všetky záznamy
 while($zaznam = mysql_fetch_object($sql))
 {
  // začneme vypisovať všetky údaje z tabuľky do stránky
  echo "<tr align=\"center\"><td>$zaznam->id</td><td>$zaznam->ip</td><td>$zaznam->datum</td><td>$zaznam->pristupov</td><td>$zaznam->zablokovane</td>";
  // vytvoríme si podmienku, aby nám zmenilo ponuku na zablokovanie/odblokovanie
  if($zaznam->zablokovane=="nie")
  {
   // ak je podmienka splnená a ip adresa nie je zablokovaná
// povolíme jej zablokovanie
   echo "<td><a href=\"admin.php?op=zablokuj&id=$zaznam->id\">Zablokuj!</a></td>";
  }
  else
  {
   // ak splnená nie je, znamená to, že už je ip adresa zablokovaná
// a my povolíme jej odblokovanie
   echo "<td><a href=\"admin.php?op=odblokuj&id=$zaznam->id\">Odblokuj!</a></td>";
  }
  // a ešte ak by sme chceli náhodou zmazať aj nejaký záznam s ip adresou
// (nepoznám logicky dôvod)
  echo "<td><a href=\"admin.php?op=zmaz&id=$zaznam->id\">Zmaz!</a></td></tr>";
 }
 // ukončíme vypísanie tabuľky
 echo "</table>";
}
/* aby sa nezobrazoval aj prihlasovací formulár, máme podmienku po nesplnení tej predošlej a tá nám
   zabezpečí, že ak je v riadku s adresou prenášaná premenná $op určíme to ako splnenie podmienky
*/
elseif($_GET['op'])
{
 // vytvoríme si pomocou rozšírenej podmienky if podmienku na zistenie a
// prevedenie určenej akcie
 switch($_GET['op'])
 {
  // ak má premenná $op hodnotu zablokuj, zablokujeme ip adresu
  case "zablokuj":
   // prevedieme si ip adresu
   $id = $_GET['id'];
   // a upravíme riadok (zmeníme stĺpec zablokovane z nie na ano)
   mysql_query("UPDATE ip SET zablokovane='ano' WHERE id='$id'");
   // vypíšeme text o úspešnosti akcie
   echo "Ip adresa bola zablokovaná!<br>\n";
   // a pridáme linku na opätovné prihlásenie
   echo "<a href=\"admin.php\">Prihlásiť znovu</a>";
  // zastavíme prevádzanie podmienky
  break;
  
  // ak má premenná $op hodnotu odblokuj, odblokujeme ip adresu
  case "odblokuj";
   // prevedieme si ip adresu
   $id = $_GET['id'];
   // a upravíme riadok (zmeníme stĺpec zablokovane z ano na nie)
   mysql_query("UPDATE ip SET zablokovane='nie' WHERE id='$id'");
   // vypíšeme text o úspešnosti akcie
   echo "Ip adresa bola odblokovaná!<br>\n";
   // a pridáme linku na opätovné prihlásenie
   echo "<a href=\"admin.php\">Prihlásiť znovu</a>";
  // zastavíme prevádzanie podmienky
  break;
  
  // ak má premenná $op hodnotu zmaz, zmažeme ip adresu
  case "zmaz";
   // prevedieme si ip adresu
   $id = $_GET['id'];
   // a odstránime riadok
   mysql_query("DELETE FROM ip WHERE id='$id'");
   // vypíšeme text o úspešnosti akcie
   echo "Ip adresa bola zmazaná!<br>\n";
   // a pridáme linku na opätovné prihlásenie
   echo "<a href=\"admin.php\">Prihlásiť znovu</a>";
  // zastavíme prevádzanie podmienky
  break;
 }
}
else
{
 /* Ak nebolo doteraz nič splnené, teda sme sa ešte len prihlásili po prvýkrát,
    alebo bolo zle zadané meno alebo heslo, vypíšeme do stránky formulár na prihlásenie
    tento formulár Vám už vysvetľovať nebudem, mali by ste ho zvládnuť bez pomoci
  */
 echo "<form name=\"login\" action=\"admin.php\" method=\"post\">";
 echo "Meno: <input type=\"text\" name=\"meno\"><br>\n";
 echo "Heslo: <input type=\"password\" name=\"heslo\"><br>\n";
 echo "<input type=\"submit\" name=\"prihlas\" value=\"Prihlas ma\">";
 echo "</form>";
}
?>

Takže ak si skript podrobne prezriete zistíte, že je podmienka rozvetvená do troch častí. Aby sa splnila prvá časť, je potrebné, aby bolo zadané meno a heslo a zodpovedalo nastaveniam. Druhá časť vyžaduje pre svoje splnenie mať v poli s url adresou určenú premennú op teda údaje prenesenú metódou GET. Ak nie je splnená ani jedna podmienka, jednoducho vypíšeme do stránky formulár na prihlásenie. Týmto formulárom začneme, keďže sa zobrazuje ako prvý.

Formulár pozostáva z troch polí, teda dvoch textových určených ako meno a heslo a jedného tlačidla pre odoslanie. Presnejšie údaje z formulára posielame metódou GET a zadávame tri premenné. Meno, heslo a tlačidlo. Tlačidlo vynecháme, pretože nebude potrebné. Ak sa aj meno a heslo zhodujú z určenými údajmi, splníme prvú podmienku a teda sa nám začne prevádzať.

Hneď na začiatku vidíme, že si vytvárame požiadavku na mysql, aby nám načítalo všetky údaje v tabuľke ip. Hneď po tom si vypisujeme do stránky hlavičku tabuľky a určenie prvého riadku. Pomocou podmienky prehľadáme a načítame všetky údaje z tabuľky. V mieste, kde vypisujeme, či je IP adresa zablokovaná alebo odblokovaná si vytvoríme jednoduchú podmienku, ktorá nám pri zablokovanej IP-čke dá na výber jej odblokovanie a pri odblokovanej nám ponúkne jej zablokovanie. Určite nám to zamedzí duplikovaniu záznamov a ďalej určite nám to zjednoduší orientáciu v záznamoch. Nakoniec ukončíme tabuľku.

V druhom kroku overujeme premennú op, v ktorej si budeme určovať, o akú akciu ide a teda či o zmazanie záznamu, zablokovanie alebo odblokovanie IP adresy. Teda spravíme si to tak, že pomocou príkazu switch rozšíreného if si určíme, o ktorú z operácií ide a vykonáme ju. Pri zablokovaní si upravíme riadok s vybranou id a zameníme stĺpec zablokovane na áno, čo bude pre náš blokovací skript znamenať zneprístupnenie stránky. Ak je operácia odblokovanie zmeníme stĺpec zablokovane na nie a pri operácií zmaž zmažeme vybraný riadok. Máme určené všetky operácie a teda máme hotový kompletný skript.

Ešte Vám ukážem ako si zavoláme funkcie teda ako vyzerá súbor index.php:

<?php
// zistíme aktuálnu ip adresu návštevníka
$ip = $_SERVER['REMOTE_ADDR'];

// pripojíme do skriptu nami nadefinované funkcie
include("funkcie.php");

// zavoláme si funkciu na zapísanie ip adresy
write_ip($ip);
// zavoláme si funkciu na zablokovanie ip adresy
blok_ip($ip);
?>
Tu bude vaša stránka

Takto bude vyzerať kompletná aplikácia na blokovanie IP adries. Myslím, že je jednoducho zapracovateľná do každého skriptu a je ľahko použiteľná kdekoľvek.

Výhody skriptu
Tento skript je dosť jednoduchý a ľahko ovládateľný, čiže by s ním nemali mať problémy ani začiatočníci. Ďalej veľkou výhodou skriptu je, že si ho môžete veľmi jednoducho poupravovať a doplniť o nové funkcie, poprípade bez problémov si ho upraviť a doplniť do vlastnej stránky. Skript som testoval pri záťaži 1800 ľudí v rozpätí asi 5 minút a bez problémov dokázal spracovávať všetky údaje, takže je minimálnou záťažou pre mysql ako i pre apache.

Nevýhody skriptu
Obrovskou nevýhodou je, že pri každej úprave sa musíte znovu nalogovať. Dá sa to bez problémov upraviť pomocou cookies poprípade ak si budete ukladať log do databázi a zrušíte ho po 15 minútach. Ďalšou nevýhodou je, že sa dá lognúť len jeden admin, teda skript je prispôsobený len pre určenie jedného mena a hesla. Aj toto je dosť jednoduchá záležitosť, napríklad si vytvoríte tabuľku s menami a heslami a vytvoríte si funkciu na prihlásenie. Ak bude človek prihlásený, uložíte hodnoty do cookies a bude ho automaticky prihlasovať po dobu x minút, poprípade kým nevypne okno prehliadača.

Smerovanie a ďalšie rozšírenie skriptu
Napadá mi hneď niekoľko rozšírení. Napríklad štatistika podľa IP adresy -  najčastejšie sa vyskytujúca IP-čka alebo tiež použitie doménových adries, ktoré by vám pomohli získať prehľad, o akú krajinu ide.

Ako som sľúbil už v prvej časti, dávam Vám celý skript na stiahnutie. Stačí kliknúť sem a stiahnete si celú aplikáciu aj s návrhom databáze.

Myslím že je toho nadnes dosť. Dúfam, že ste skript pochopili a že nevznikne u Vás žiadny problém. Ak áno, kontaktujte ma na maile  uvedenom nižšie. Nabudúce sa pozrieme na ďalší problém poprípade podnet, ktorý mi príde od Vás. Píšte aj naďalej podnety na články týkajúce sa php a mysql, rád sa na ne pozriem a skúsim o nich popísať niečo bližšie

Rastislav Turek // lammer.sk
turek@inet.sk
alebo support@lammer.sk

Neprehliadnite: