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.

<?php
if (in_array($_SERVER['REMOTE_ADDR'], array_map('trim', file('ip.txt'))) {
  http_response_code(403);
  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"].