Corsi on-line

Un semplice guestbook con file di testo al posto del DB

  • CommentiScrivi un commento
  • ForumDiscuti sul forum
  • PrevUn semplice Formmail
  • NextGestire gli Upload mediante form

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

Partecipa alle pre-registrazioni dei domini .cloud

Non perdere l'opportunità di aggiudicarti prima degli altri uno dei nuovi domini .cloud! Prenota i migliori domini e proteggi il tuo nome!

Corsi
  • Corso Linux
    Corso Linux
    Guida completa al sistema open-source. A partire da 39 €
  • Corso MySQL
    Corso MySQL
    Gestione del database open-source. A partire da 39 €
  • Corso PHP
    Corso PHP
    Creare siti web dinamici avanzati con PHP e MySQL. A partire da 39 €
Vedi anche...
Guide