PHP FAQ

Jak zablokować wybrane adresy IP

Coldpeer

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)!

FAQ

4 komentarzy

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

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

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

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