Riprendo di nuovo il tema degli errori, dopo averne parlato la scorsa estate.
Una buona diagnostica degli errori è fondamentale per qualsiasi linguaggio di programmazione, ma nel caso di linguaggi per il web molti dettagli dovrebbero essere tenuti abbastanza nascosti agli utenti quando la procedura va in produzione.
Un esempio tipico è il verificarsi di un problema di connessione al database che impedisce il caricamento dei contenuti di un sito. Per capire cosa sto dicendo provate a cercare su Google la stiringa warning mysql_connect “access denied for user” “using password”; se andate un po’ in là nei risultati cominciate a trovare non più le pagine che descrivono questo errore, ma i siti in cui si verifica questo errore. La visualizzazione sulla pagina del client di questa diagnostica è abbastanza pericolosa perché può rivelare informazioni utili per eventuali attacchi al sito. Ecco due esempi di diagnostica consegnata al browser del visitatore:
Warning: mysql_connect() [function.mysql-connect]: Access denied for user ‘festival’@’localhost’ (using password: YES) in /home/www/if/old/functions.php on line 86
Microsoft OLE DB Provider for SQL Server error ‘80040e4d’ Login failed for user ‘mediamanager’. /V1/Playlist.asx, line 30
Nella prima diagnostica non solo diciamo a tutto il mondo che stiamo utilizzando MySQL, ma riveliamo il nome dell’utente con cui ci connettiamo al database e il path assoluto dei file nel sito web; in questo modo un attaccante che vuole leggere, ad esempio, il file /etc/passwd sa che il path relativo a functions.php è ../../../../../etc/passwd
Se il server HTTP e il linguaggio utilizzato lo prevedono (e di solito lo prevedono), la prima azione da intraprendere è ovviamente la disabilitazione dell’invio di ogni tipo di messaggio al client, limitandosi a tenere un log locale degli errori.
Dal momento che, come nel primo esempio, l’apertura della connessione al server SQL avviene solitamente in un solo punto del programma, per evitare questo tipo di problema è sufficiente testare il valore ritornato dalla funzione di connessione e, in caso di errore, visualizzare una pagina di cortesia in cui si dice che il sito è temporaneamente in manutenzione o qualcosa del genere. Attenzione a mettere la diagnostica dettagliata dell’errore tra commenti HTML come fa, per esempio, Flickr perché non sono l’unico io ad andare a vedere il sorgente HTML di questo tipo di pagine…