L'anticamera del cestino

Raccolta differenziata di esperienze di dubbia utilità

Webdevelop-PHP: come ho risolto il problema dello spam

leave a comment »

Recentemente ho riscritto il sito Recensioni di ristoranti e opinioni libere. Il sito, che in origine era basato sul CMS Mambo, è stato completamente riscritto da zero con PHP/MySQL. Come prima fase dello sviluppo ho deciso di scrivere un sistema minimale di gestione dell’archivio di recensioni e dei commenti. Volutamente ho tralasciato di sviluppare il filtraggio dei commenti per prevenire lo spam, rimandando la stesura di questa parte ad una fase successiva. Tuttavia, poichè nel giro di un paio di giorni mi è arrivata una vera e propria ondata di spam, ho anticipato l’implementazione del controllo anti spam. Ecco cosa ho fatto:

1) Nomi un po’ meno scontati ai files delegati all’invio dei commenti
Il file delegato all’inserimento dei commenti aveva un nome molto scontato e forse troppo facile da individuare. Così l’ho rinominato da sendcomment.php a postailcommento.php. Poi ho inserito nel file robots.txt le righe seguenti per escludere dalla ricerca di google i files per l’invio dei commenti:

Disallow: /postailcommento.php
Disallow: /_commentform.php

Onestamente non so se questa modifica può aiutare a prevenire lo spam, ma sicuramente male non fa.

2) Blacklist
Ho creato nel database una blacklist nella quale inserire gli indirizzi ip degli spammer che ovviamente ho avuto cura di raccogliere e archiviare ad ogni invio del commento. Se l’ip della macchina che cerca di inserire il commento è nella blacklist in commento non viene postato.

3) Captcha
Ho implementato nell’inserimento del commento il captcha utilizzando l’ottimo Securimage.
Il codice per il controllo anti spam è risultato il seguente:

$query = "SELECT ip FROM blacklist WHERE ip='$_POST[ip]' LIMIT 1";
$result = mysql_query($query) or die (mysql_error());
$spammer_ip = mysql_num_rows($result);

if (!$spammer_ip) {
  $captcha = new Securimage();
  if ($captcha->check($_POST['captcha_code']) == true) {
    sendcomment();
  } else {
  # CAPTCHA NON RICONOSCIUTO
    echo "<h1>Verifica antispam fallita</h1>";
    echo "<p>L'immagine di riconoscimento antispam inserita non &egrave;
          corretta. Premi il tasto per tornare indietro sul tuo browser e
          ricarica l'immagine</p>";
    $log = new Logger("$_POST[ip] failed captcha");
  }
}else{
  # BLACK LISTED IP
  $log = new Logger("$_POST[ip] is black listed and try to send comment");
}

Il codice può essere scritto meglio evitando i due controlli if uno dentro l’altro. Però volevo anche evitare if (!$spammer_ip and controllocaptca) per trattare diversamente i due casi. Lo riscriverò forse con switch o magari con qualche suggerimento che perverrà dai lettori.

Written by Max-B

31 agosto 2009 a 13:13

Pubblicato su MySQL, php

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: