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)!
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"].