Spammers van je website weren (PHP)

Spam bots zijn vervelende dingen waar soms lastig vanaf te komen is. Er zijn al een heleboel verschillende soorten manieren bedacht en gemaakt om spam tegen te gaan: Teksten over typen, rekensommetjes doen, katten herkennen, geluiden herkennen, en zo kan ik nog wel even doorgaan. Omdat spammers dit vaak op grote schaal doen, zijn er al databases aangelegd met de IP-adressen van deze personen. Het is daarom stukken makkelijker om hier gebruik van te maken. Stop Forum Spam.com heeft een dergelijke database beschikbaar via een API. Hier zal ik dan ook gebruik van gaan maken.

IP adres controleren

De eerste stap is het controleren van het IP-adres van de bezoeker. Deze kan eenvoudig via de API opgevraagd worden:

  1. $request = file_get_contents('http://www.stopforumspam.com/api?ip=' . $_SERVER['REMOTE_ADDR']);

De file_get_contents functie haalt de pagina op, en plaatst dit in een variabele. Als resultaat krijgen wij een XML terug wat er ongeveer zo uitziet:

  1. <response success="true">
  2.         <type>ip</type>
  3.         <appears>yes</appears>
  4.         <lastseen>2011-03-02 13:47:03</lastseen>
  5.         <frequency>706</frequency>
  6. </response>

XML parsen

De volgende stap is de XML parsen zodat deze makkelijk uitgelezen kan worden. PHP heeft hier een ingebouwde class voor: simpleXML. Deze kan eenvoudig gebruikt worden voor ons doel:

  1. $xml = simplexml_load_string($response);

Vervolgens kunnen de variabelen uit de XML eenvoudig uitgelezen worden. Zo willen wij ten eerste controleren of het IP-adres überhaupt wel in de database voorkomt. Hiervoor moet er tussen de appears tags yes. Wanneer er hier no staat komt het IP-adres niet in de database voor.

  1. if($xml->response->appears == 'no') {
  2.   // Het IP-adres komt niet voor in de database, dus het is geen spammer.
  3. }

Omdat het kan gebeuren dat iemand per ongeluk op de verkeerde moment op de verkeerde plaats was, willen wij controleren hoe vaak het IP-adres in de database voorkomt. Dit staat tussen de frequency tags voorkomt.

  1. if($xml->response->frequency < 3) {
  2.   // Het IP-adres komt maar 1 of 2 keer door, dus waarschijnlijk geen spammer
  3. }

Wanneer de bezoeker niet aan één van deze 2 vereisten voldoet is het dus hoogstwaarschijnlijk een spammer. De controle code ziet er dan ongeveer zo uit:

  1. $request = file_get_contents('http://www.stopforumspam.com/api?ip=' . $_SERVER['REMOTE_ADDR']);
  2. $xml = simplexml_load_string($response);
  3.  
  4. if($xml->response->appears == 'no') {
  5.         $spammer = false;
  6. } elseif($xml->response->frequency < 3) {
  7.         $spammer = false;
  8. } else {
  9.         $spammer = true;
  10. }
  11.  
  12. if($spammer) {
  13.         die("Spammers zijn niet toegestaan");
  14. }

Om ervoor te zorgen dat er niet bij elke pagina wordt gecontroleerd of de bezoeker een spammer is, zal ik een sessie aanmaken om te controleren of de bezoeker al op spammen is gecontroleerd:

  1.  
  2. if(!isset($_SESSION['spammer'])) {
  3.         $request = file_get_contents('http://www.stopforumspam.com/api?ip=' . $_SERVER['REMOTE_ADDR']);
  4.         $xml = simplexml_load_string($response);
  5.  
  6.         if($xml->response->appears == 'no') {
  7.                 $spammer = false;
  8.         } elseif($xml->response->frequency < 3) {
  9.                 $spammer = false;
  10.         } else {
  11.                 $spammer = true;
  12.         }
  13.  
  14.         if($spammer) {
  15.                 die("Spammers zijn niet toegestaan");
  16.         }
  17.        
  18.         $_SESSION['spammer'] = false;
  19. }