Personalizzare i messaggi d'errore con .htaccess di Apache

Introduzione

Prima di iniziare questo breve tutorial, introduciamo il concetto di status code che in parole povere permette di capire ai clients qual’è il risultato della transazione appena effettuata.
I codici di stato sono divisi principalmente in 5 categorie:

  • Informational Status Codes (100-199)
  • Success Status Codes (200-299)
  • Redirection Status Codes (300-399)
  • Client Error Status Codes (400-499)
  • Server Error Status Codes (500-599)

Chiarisco subito che tutti gli esempi si riferiranno al codice d’errore 404 ma è possibile applicare le stesse conoscenze anche agli altri codici indicanti anomalie o problemi di ogni sorta.

Personalizziamo l’errore 404

Questo tipo di errore si presenta nel caso in cui l’URL richiesto non può essere trovato (ossia quando facciamo riferimento ad un link vecchio che non esiste più o che è stato spostato).
Di default la pagina d’errore che Apache fa apparire non è molto utile ai fini della navigazione visto che si limita a dare una breve spiegazione della tipologia d’errore senza aiutare l’utente a porne rimedio (se esiste), quindi può nascere l’esigenza di volerlo personalizzare.
Nel momento in cui Apache si trova di fronte a voler comunicare un errore/problema, può fare le seguenti cose:

  • Visualizzare un breve messaggio con il codice d’errore
  • Visualizzare un messaggio personalizzato
  • Redirezionare ad un URL locale la cattura dell’errore
  • Redirezionare ad un URL esterno la cattura dell’errore

La prima opzione della lista è quella scelta di default da Apache però tramite l’utilizzo del file .htaccess (o in generale il file che indichiamo nella direttiva AccessFileName nel file di configurazione di Apache) possiamo cambiare le carte in tavola.
Per personalizzare i vari messaggi d’errore si utilizza la direttiva errorDocument che permette di indicare la pagina (o il messaggio) da visualizzare quando avviene un errore.
La sintassi generalizzata di questa direttiva è la seguente:

ErrorDocument codice-di-stato documento

Per capire più a fondo l’utilizzo di questa direttiva vediamone alcuni esempi:

  1. ErrorDocument 404 "Risorsa non trovata"

In questo caso viene visualizzata la stringa “Risorsa non trovata”.

  1. ErrorDocument 404 /modifica/errore404.html

Alla presenza dell’errore 404 si viene rimandati all’URL relativo “/modifica/errore404.html”; inoltre è possibile utilizzare un URL assoluto sia locale sia esterno al proprio dominio.

Concludiamo

La possibilità di poter modificare i messaggi d’errore ci permette di creare un sito molto più accessibile e usabile visto che possiamo aiutare l’utente a trovare proprio ciò che cercava.
Possiamo fare in modo che la pagina d’errore sia una pagina dinamica che mandi una mail a noi stessi (con referer e link errato), così possiamo sapere eventuali link non esistenti o link errati da altri siti.
Insomma, si possono fare una miriade di cose, basta avere la volontà di farle ;)

Fonti

Libri:

  • Apache The Definitive Guide
  • HTTP The Definitive Guide

Autenticazione e autorizzazione usando .htaccess di Apache

Requisiti

  • Soltanto un po’ di pazienza

Differenza tra autenticazione e autorizzazione

Nel momento in cui noi proteggiamo una directory possiamo vedere come l’utente deve passare obbligatoriamente in due passaggi:

  1. Autenticazione: Il web server non conoscendo l’identità dell’utente ne chiede le credenziali (login e password) e dopo averle ricevute le confronta con il proprio database per vedere se può ottenere l’accesso.
  2. Autorizzazione: Una volta convinto il server che siamo veramente noi deve controllare se abbiamo o meno i permessi (e se si quali).

Entrambi questi passaggi in caso di errore restituiscono il codice 401 corrispondente al unauthorized.

Cos’è il file .htaccess

Questo file ci permette di modificare delle direttive di configurazione del webserver Apache senza riavviarlo: ciò risulta molto utile nel caso di server affollati dove ogni utente ha richieste particolari.
Se non ci fosse l’.htaccess dovremmo chiedere al gestore del server di proteggerci una determinata cartella, di dove redirezionare l’errore 404, quali regole usare per il rewrite, ecc… quindi in tal caso ogni richiesta da parte dell’utente corrisponderebbe al riavvio del webserver e all’allergia che proverà il gestore del webserver ogni volta che sentirà la nostra voce :P.
Quindi il vantaggio risulta essere l’estrema flessibilità ma dall’altra parte della medaglia vedremo una diminuzione delle performance generali visto che questo file viene letto ad ogni richiesta (e in modo ricorsivo seguendo tutta la path).
Il file .htaccess di esempio (che metteremo nella directory da proteggere) che studieremo è il seguente:

  1. AuthName "Pagina riservata"
  2. AuthType Basic
  3. AuthUserFile /WWW/simonin/riservato/.htpassword
  4. Require valid-user

Ora esaminiamolo riga per riga.

AuthName (nome)

Essa ci permette di indicare praticamente il titolo della finestra che apparirà all’utente, con l’unica precauzione di racchiudere la stringa tra le virgolette doppie nel caso in cui contenga degli spazi.

AuthType (tipo)

Questa direttiva ci permette di specificare che tipo di controllo verrà utilizzato per l’esame delle credenziali.
Esistono 2 tipi di controlli:

  • Basic: Risulta essere la forma di controllo più semplice è più insicura visto che applica una codifica 64bit sulle credenziali e l’invio di quest’ultime avvengono in chiaro nell’header. Le credenziali possono venire immagazzinate in un semplice file di testo oppure in una vasta varietà di databases quali MySQL, Oracle, ecc… con la possibilità di trasferirle semplicemente da un server all’altro. Per la creazione delle password Apache mette a disposizione htpasswd.
  • Digest: La differenza principale con il primo metodo riguarda il fatto che nessuna credenziale viene passata in chiaro rendendo quindi molto difficile il cracking di quest’ultime. Nativamente Apache permette di memorizzare le credenziali solo in un file di testo poggiandosi quindi su moduli di terze parti per la memorizzazione in databases, inoltre c’è da specificare come non tutti i browser siano compatibili con questa tipologia di autenticazione. Per la creazione delle password Apache mette a disposizione htdigest.

AuthUserFile (nomefile)

La seguente direttiva ci permette di indicare la posizione del file (con il path assoluto) contenente le varie coppie username/password.
Per creare questo file Apache (nel caso dell’autenticazione Basic) ci mette a disposizione il tool htpasswd.
Vediamone alcuni esempi:

htpasswd -c credenziali daniele
In questo caso viene creato un file di nome credenziali nella quale viene inserito l’username daniele. La password verrà richiesta in seguito.

htpasswd credenziali matteo
In questo modo viene aggiunto un nuovo username (in questo caso matteo) al file credenziali. La password verrà richiesta in seguito.

htpasswd -b credenziali luca lapwddiluca
In questo modo viene aggiunto un nuovo username (in questo caso luca) al file credenziali con la password lapwddiluca corrispondente. Il flag -b indica che la password è stata passata tramite linea di comando e quindi non verrà richiesta in seguito.

Gli algoritmi che ci permette di usare sono il crypt e l’md5 a seconda delle nostre preferenze e del sistema che ospita il webserver.
La sintassi di htdigest come ci si poteva aspettare è molto simile a quella dell’htpasswd.
Bisogna notare inoltre come in Windows le password non vengano criptate ma devono essere scritte in chiaro sul file delle passwords.
Per facilitare la vita a chi deve comporre questo file (e non gli piace htpasswd) ho creato una piccola applicazione in flash che spero vi risulti utile:

Come potete vedere vi basta inserire username e password e dopo la pressione del tasto OK vi verrà creata la stringa da mettere nel vostro file delle passwords.

AuthGroupFile (nomefile)

Ci permette di indicare il nome di un file (con il path assoluto) contenente i vari gruppi di utenti e i suoi membri.
Nell’esempio non è stata utilizzata questa direttiva ma risulta molto utile quando bisogna gestire un numero di utenti elevato.
Il file che indicheremo potrà essere fatto in questo modo:

amministratori: daniele matteo
nullafacenti: luca

In questo caso abbiamo due gruppi di utenti alla quale potremmo in seguito discriminarne l’accesso a determinate directory o files.
Questa direttiva ci permette quindi di dividere logicamente un vasto numero di utenti facilitandoci di molto la vita.

Require ([user utente1 utente2] [group gruppo1 gruppo2] [valid-user] [valid-group])

Questa è la direttiva che ci permette di indicare chi può avere accesso e chi no.
Possiamo specificare in vari modi quali sono gli utenti e i gruppi che avranno accesso alla directory:

  • valid-user: Se usiamo questo parametro ogni utente (dopo l’autenticazione) contenuto nel file specificato nella direttiva AuthUserFile sarà accettato (e quindi avrà l’accesso).
  • valid-group: Ogni gruppo contenuto nel file specificato dalla direttiva AuthGroupFile otterrà l’accesso sempre se l’autenticazione ha avuto successo (ossia se gli utenti appartenenti al gruppo hanno inserito la password personale corretta).
  • user utente1 utente2: Con questi parametri noi possiamo specificare quali utenti avranno l’accesso.
  • group gruppo1 gruppo2: In questo caso specifichiamo quali sono i gruppi che potranno accedere dopo l’autenticazione alla directory protetta.

Dalla versione di Apache 1.3.20 sono stati aggiunti gli argomenti file-owner e file-group che permettono l’accesso nel caso in cui l’utente (o gruppo) che si autorizza è pure l’owner del file. Questo permette ai vari utenti (o gruppi) di accedere unicamente ai propri files che “possiede”.
L’ultima cosa da dire riguardo questi due argomenti è che in ogni caso l’utente deve essere presente nella lista degli users nel file indicato dalla direttiva AuthUserFile.

Altri esempi di utilizzo

Per vedere le varie modalità d’uso eccovi un paio di esempi:

  1. AuthName "Pagina riservata"
  2. AuthType Basic
  3. AuthUserFile /WWW/simonin/riservato/.htpassword
  4. Require user daniele matteo

L’esempio appena citato può essere scritto anche in questo modo (considerando i gruppi formati prima):

  1. AuthName "Pagina riservata"
  2. AuthType Basic
  3. AuthUserFile /WWW/simonin/riservato/.htpassword
  4. AuthGroupFile /WWW/simonin/riservato/.htgroup
  5. Require group amministratori

Concludiamo

Bene ora sapete come si fa a proteggere facilmente una directory usando l’.htaccess dell’Apache; ovviamente ci sono altre direttive e altri tipi di controllo che si possono fare in modo incrociato per aumentare considerevolmente la sicurezza ma per approfondimenti vi rimando al sito Apache.org.

Fonti

Libri:

  • Apache The Definitive Guide
  • Apache CookBook