Programowanie w języku PHP » FAQ

Jak zablokować wybrane adresy IP

  • 2007-02-27 14:02
  • 4 komentarze
  • 1061 odsłon
  • Oceń ten tekst jako pierwszy
Prowadzimy własną księgę gości, system komentarzy, forum? Jakiś intruz zaczyna ją spamować, floodować, obrażać nas? Czy to oznacza, że bedziemy mieli ciężkie wieczory? :) Nie! Zablokujmy delikwentowi dostęp do naszej strony, znając jego IP.

Prosty skrypt napisany w języku PHP, który zaraz przedstawię, ma za zadanie "blokować" dostęp do naszej strony, komputerom (adresom IP), przechowywanym w pliku tekstowym.

Oto kod:
<?php
$baza = file('ip.txt'); // baza zbanowanych ip
$ip = count($baza);
for($i = 0; $i < $ip; $i++) // pętla
{
  $baza[$i] = trim($baza[$i]);
  if($baza[$i] == $_SERVER['REMOTE_ADDR']) {
    echo 'Zostałeś zablokowany!';
    exit();
  }
}
?>


W pliku "ip.txt" przechowujemy listę zbanowanych adresów IP, każdy w oddzielnej linijce.

Uwaga! Skrypt nie zadziała, jeśli użytkownik będzie miał zmienne IP (np. Neostrada)!

4 komentarze

tomkiewicz 2007-03-03 20:38

po co tak utrudniac :P. Poza tym przy duzej bazie ip i wielu odiwedzinach skrypt moze niepotrzebnie serwer obciazac :P (a moze to tylko takie nawyki z OI? :D)

$baza = file('ip.txt');
if ((in_array($_SERVER['REMOTE_ADDR']."\n", $baza)) ||
  (in_array($_SERVER['HTTP_X_FORWARDED_FOR']."\n", $baza))) //tak jak napisal jaygo
{ die('Masz bana'); }

trzeba pilnowac, zeby w bazie nie bylo zbednych bialych znakow, \r nawet chyba nie przejdzie... jak ktos chce to sobie doda obok \n w skrypcie i bedzie smigac

warto byloby dodac banowanie masek itp (mozna wykonac druga baze z maskami i obcinac sprawdzany ip do rozmiaru maski (w praktyce mozna na stale przyjac *.FF.FF.FF). Przyda sie tez banowanie po maskach hostow (w sensie ze domen tekstowych)

no i dodatkowym rozwiazaniem jest autobanowanie po ciasteczkach, sesjach (osobno - jest szansa, ze ciasko sesji przetrwa, a zwykle nie, albo na odwrot) - dziala na neo w przypadku mniej zaawansowanych userow ;)

no a calkiem poza tym to polecam uzycie w takich przypadkach foreach zamiast for :). Wygodniej i ladniej wyglada

EDIT: ale mi pomysl przyszedl do glowy :D. Gdzies kiedys wyczytalem, ze zmiane zawartosci sie ustala naglowkami (mozna na przyklad hasha tam wstawic czy cos). Przegladarka wysylajac GETa w naglowku odsyla tego hasha, czy co tam wyslemy i w response mozna oddac, czy zawartosc zmieniona (i przegladarka moze pobrac to cos z cache), czy wysylac od nowa... a jesli by wysylac tym IP? Dodatkowe miejsce do przechowywania tego info - nie kazdemu przyjdzie do glowy wyczyscic cache oprocz cookiesow

Coldpeer 2007-02-23 14:51

bordeux: wiesz, to i tak był tylko przykład, chodzi o sam sens.

Marooned 2007-02-27 15:52

Ale przydało by się rozbudować ten kod, bo w obecnej wersji jest lekko śmieszny i mało praktyczny.

jaygo 2007-02-28 06:25

Można byłoby się zastanowić czy przy okazji nie sprawdzać zmiennej $_SERVER["HTTP_X_FORWARDED_FOR"].