Een IP-Blocker maken in PHP

Heb je last van vervelende bezoekers op je website? Dan kan het handig zijn om een IP-blocker erop te plaatsen. Hiermee kun je eenvoudig IP-adressen blokkeren zodat deze niet meer op jou website komen. Een IP-blocker kun je op verschillende manieren maken. In dit voorbeeld ga ik gebruik maken van array's in PHP, en van een variant met MySQL.

IP-adres verkrijgen

Om een IP-adres te blokkeren, moet je natuurlijk wel weten welk IP-adres dat is. Dit IP-adres kun je opvragen met de PHP waarde $_SERVER['REMOTE_ADDR']. Echter kun je zo niet zien wat het IP-adres van de bezoeker is. Daarvoor moet deze eerst ergens opgeslagen worden. In dit voorbeeld worden de IP-adressen weggeschreven in een tekst bestand. Dit bestand heet bezoekers.txt. Op dit bestand moeten wel de juiste rechten gezet worden, te weten 777. Klik hier voor het voorbeeld.

IP-adres blokkeren

Nu wij de IP-adressen beschikbaar hebben kunnen wij deze gaan blokkeren. Ik zal eerst de manier uitleggen hoe dit gedaan kan worden zonder MySQL. Verderop in deze tutorial zal ik de MySQL manier uitleggen.

Om alle IP-adressen op een logische manier te schikken ga ik hiervoor een array gebruiken. Je kunt namelijk heel eenvoudig data aan een array toevoegen:

  1. $ipAddress[] = '123.34.56.392';
  2. $ipAddress[] = '483.382.485.3';
Op dezelfde manier kun je heel eenvoudig uitbreiden met IP-adressen. Wanneer het erg veel IP-adressen worden kun je beter overstappen op een IP-blocker met database. De volgende stap is controleren of het IP-adres in de array zit. Dat kan heel eenvoudig met de functie in_array. Deze functie geeft true wanneer het IP-adres in de array zit, en het geeft false wanneer dit IP-adres niet in de array zit. Hierdoor kunnen wij daardoor een if/else constructie gebruiken om dit te controleren. Het voorbeeld zal er dan ongeveer zo uitzien:
  1. if( in_array( $_SERVER['REMOTE_ADDR'], $ipAddress ) ) {
  2.   // Deze code uitvoeren wanneer iemand niet op de website mag komen
  3. } else {
  4.   // Deze code uitvoeren wanneer er geen blokkering voor het IP-adres is
  5. }
Omdat dit soms vrij lastig kan zijn omdat je je hele pagina in de else moet plaatsen. Om dit op de lossen is het makkelijker om de pagina te laten eindigen via exit. De code ziet er dan als volgt uit:
  1. if( in_array( $_SERVER['REMOTE_ADDR'], $ipAddress ) ) {
  2.   // Deze code uitvoeren wanneer iemand niet op de website mag komen
  3.   exit;
  4. }
Wanneer je deze code in een apart bestand zet, hoef je enkel deze pagina te includen om het script zijn werk te laten doen. De totale code ziet er dan zo uit:
  1. $ipAddress[] = '123.34.56.392';
  2. $ipAddress[] = '483.382.485.3';
  3.  
  4. if( in_array( $_SERVER['REMOTE_ADDR'], $ipAddress ) ) {
  5.   // Deze code uitvoeren wanneer iemand niet op de website mag komen
  6.   exit;
  7. }

De MySQL variant

In MySQL dienen wij eerst een tabel te maken waarin staat welke IP-adressen geen toegang hebben. Ik gebruik daarvoor deze opbouw:

  1. CREATE TABLE `deniedIps` (
  2. `ipAdres` VARCHAR( 15 ) NOT NULL ,
  3. `reden` TEXT NOT NULL
  4. )

In dit voorbeeld heb ik 3 velden gemaakt:

  • id - Het ID
  • ipAdres - Het IP adres dat geblokkeerd is.
  • reden - In dit veld kan een eventuele reden van blokkade opgegeven worden
Eventueel kun je nog extra velden toevoegen wanneer dat nodig is. Met behulp van deze query kunnen wij controleren of de bezoeker de website mag bezoeken:

  1. select reden from deniedIps where ipAdres = '123.123.123.123'

Met de PHP functie mysql_num_rows kan daardoor eenvoudig gecontroleerd worden of er resultaten in de database aangetroffen zijn. Wanneer er een resultaat in de database staat houdt dat in dat de bezoeker een IP-block heeft. Het PHP script zal er dan zo komen uit te zien:

  1. $sql = sprintf("select reden from deniedIps where ipAdres = '%s'",
  2.          mysql_real_escape_string($_SERVER['REMOTE_ADDR'])
  3.     );
  4. $query = mysql_query($sql);
  5. if(mysql_num_rows($query) > 0) { // In deze regel wordt gekeken of er meer dan 0 resultaten zijn aangetroffen. is dat het geval dan mag er geen toegang worden verleend
  6.   $row = mysql_fetch_array($query);
  7.   echo 'U bent heeft geen toegang tot de pagina. U bent geblokkeerd om de volgende reden:<br />';
  8.   echo $row['reden']; // Dit toont de reden waarom de bezoeker geblokkeerd is
  9.   exit; // Ervoor zorgen dat de pagina verder niet getoond wordt.
  10. }

Wil je weten waarom ik hier gebruik maak van sprintf? Lees dan dit artikel over het plaatsen van PHP waardes in een SQL query

Eindnoot

Dit is het hele script. Hiermee kun je vervelende bezoekers tegengaan, op een vrij eenvoudige manier. Wanneer je vragen hebt, kun je altijd contact opnemen