L'anticamera del cestino

Raccolta differenziata di esperienze di dubbia utilità

Archive for the ‘MySQL’ Category

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.

Annunci

Written by Max-B

31 agosto 2009 at 13:13

Pubblicato su MySQL, php

5 records a caso

leave a comment »

ado da backgammon

Dado da backgammon. Immagine di Ptkfgs di Pubblico Dominio

Avevo la necessità di prelevare 5 record a caso, da una tabella MySQL, da pubblicare su un sito web che sto realizzando. Temevo che fosse una operazione non troppo semplice e già stavo pensando a come manipolare con PHP i dati della query per ottenere delle sequenze random ad ogni richiesta.

Poi ho scoperto che è possibile farlo direttamente con la query SQL in modo estremamente semplice. Ecco una query di esempio:

SELECT * FROM la_mia_tabella ORDER BY Rand() LIMIT 5

Seleziona tutti i campi della tabella “la_mia_tabella”, li ordina in modo casuale e limita l’output a 5 records.

Written by Max-B

7 gennaio 2009 at 12:46

Pubblicato su MySQL, php

Tagged with