Corsi on-line
Chiudi
Newsletter:
  • Seguici su Facebook
  • Seguici su Twitter
  • Seguici su Google+
  • Seguici via RSS
  • Seguici col tuo Smartphone

Un semplice guestbook con file di testo al posto del DB

Articolo scritto da Claudio Garau

In questo breve articolo descriveremo la procedura necessaria per creare un piccolo guestbook in CGI basato unicamente su due file: guestbook.cgi, il cui compito sarà quello di raccogliere le firme degli utenti tramite un form e di mostrarle a video dopo averle scritte su un file di testo, e guestbook.txt che fungerà da database.

Il codice non è particolarmente complesso, ma per facilitare la lettura abbiamo inserito dei commenti lungo il listato:

#!/usr/bin/perl -wT
use CGI;
use Fcntl;

#inizializziamo l'applicazione e stabiliamo 
#il numero massimo di messaggi da mostrare
$guest = new CGI;
$rows = 20; 
$db = '/var/www/html/guestbook.txt';

unless ($action = $guest->param('action'))
{
  $action = 'Nessun invio';
}

#stampiamo una pagina HTML in cui mostrare i messaggi
print <<"EndOfText";
Content-type: text/html
<html>
<head>
<title>Un guestbook in CGI</title>
</head>
<body>
<h2>Messaggi</h2>
EndOfText

#controlliamo che siano stati inviati i parametri richiesti
if ($action eq 'Invia')
{
  $nome = $guest->param('nome');
  $citta = $guest->param('citta');
  $nazione = $guest->param('nazione');
  $messaggio = $guest->param('messaggio');

  #ogni parametro viene controllato con espressioni regolari
  #per impedire l'inserimento di codice HTML nel file di testo
  unless ($nome)
  {
    $nome = 'sconosciuto';
  }
  $nome =~ s/</&lt;/g;
  unless ($nome =~ /^([^<]*)$/)
  {
    die "Non credo che tu ti chiami veramente: $nome\n";
  }
  $nome = $1;

  $recapiti = "$citta, $nazione";
  $recapiti =~ s/, , /, /; 
  $recapiti =~ s/^, //; 
  $recapiti =~ s/, $//; 
  if ($recapiti =~ /^[,\s]+$/)
  {
    $recapiti = 'Recapito sconosciuto';
  }
  $recapiti =~ s/</&lt;/g;
  unless ($recapiti =~ /^([^<]*)$/)
  {
    die "Non credo che tu scriva veramente da: $recapiti\n";
  }
  $recapiti = $1;

  #stabiliamo la lunghezza massima del messaggio
  #in numero di caratteri consentiti
  if (length($messaggio) > 10000)
  {
    $messaggio = 'Messaggio troppo lungo...';
  }
  unless ($messaggio)
  {
    $messaggio = 'Nessun messaggio inviato.';
  }
  $messaggio =~ s/\r\n?/\n/g;
  $messaggio =~ s/</&lt;/g;
  unless ($messaggio =~ /^([^<]*)$/)
  {
    die "Non puoi scrivere: $messaggio\n";
  }
  $messaggio = $1;

  #mostriamo a video le firme
  $firme = <<"EndOfText";
  <b>$nome</b> scrive da $recapiti<br />
  <i>$messaggio</i>
  <hr>
  EndOfText

  #apriamo il file che funge da database
  #e estraiamo tutte le firme con un ciclo  
  sysopen(MESSAGGI, "$db", O_RDWR)
  or die "Impossibile aprire il file $db: $!";
  flock(MESSAGGI, 2);
  while(<MESSAGGI>)
  {
    $tutte_le firme .= $_;
  }
  $tutte_le_firme.= $firme;
  if ($rows)
  {
    @array = split(/<hr>/i, $tutte_le firme);
    $contatore = @array - 1;
    while ($contatore > rows)
    {
      shift @array;
      $contatore = @array - 1;
    }
    $tutte_le firme = join('<hr>', @array);
  }
  seek(MESSAGGI, 0, 0);
  truncate(MESSAGGI, 0);
  print MESSAGGI $tutte_le firme;
  close(MESSAGGI);
}

open (IN, "$db");
flock(IN, 1);
while (<IN>)
{
  print;
}
close IN;

#form per la registrazione dei messaggi
print <<"EndOfText";
<h3>Firma il guestbook:</h3>
<form method="POST" action="/cgi-bin/guestbook.cgi">
Nome:<br />
<input nome="nome" size="20"><br />
Città:<br />
<input nome="citta" size="20"><br />
Nazione:<br />
<input nome="nazione" size="20"><br />
Messaggio:<br />
<textarea nome="messaggio" rows=5 cols="20"></textarea><br />
<input type="submit" nome="action" value="Invia">
</form>
</body>
</html>
EndOfText
Da notare come l'applicazione preveda svariati controlli sui parametri di input: viene controllato infatti il loro effettivo invio, vengono poi passati al setaccio con le espressioni regolari per evitare l'inserimento di codice HTML e, in alcuni casi, viene anche posto un limite alla lunghezza massima consentita.

Per concludere, la consueta avvertenza riguardante gli opportuni permessi da assegnare ai file.
guestbook.cgi dovrà essere settato per consentirne l'esecuzione:

chmod 755 guestbook.cgi
Mentre il database di testo dovrà essere settato in scrittura per tutti e lettura solo per l'admin:
chmod 622 guestbook.txt

Corsi
Corso LinuxCorso Linux
Guida completa al sistema open-source. A partire da 39 €.
Corso MySQLCorso MySQL
Gestione del database open-source. A partire da 49 €.
Corso PHPCorso PHP
Corso completo per la creazione di siti Web dinamici. Sconto -25% sino al 23/05/2012.
Vedi anche...
Annunci

Mr.Webmaster

Pubblicità
Chi Siamo
Contattaci
Collabora
Note Legali
© 2003 - 2012 Mr.Webmaster - Il portale dei Webmaster Italiani - Tutti i diritti riservati | Powered by IKIweb Internet Media S.r.l. - PIVA 02848390122