Protezione di una directory con .htpasswd e .htaccess

ATTENZIONE! Il post ha più di 2 anni e le informazioni contenute potrebbero essere obsolete (ad esempio a causa di un aggiornamento di versione rispetto agli elementi descritti o links modificati da siti esterni).

Utilizzando un webserver Apache è possibile creare un'area protetta da password senza dover gestire sistemi di autenticazioni complessi.
Questo può tornare utile ad esempio in fase di sviluppo per creare una sezione protetta per un breve periodo o per creare una semplice area riservata per il download di files.

Per raggiungere l'obiettivo si utilizza la combinazione di due files: .htaccess e .htpasswd.

Il file .htaccess deve essere caricato all'interno della directory da proteggere (o nella webroot se si vuole richiedere la password per tutto il sito). Al suo interno inseriamo:

AuthType Basic
AuthName "Accesso riservato"
AuthUserFile /percorso_completo/.htpasswd
Require valid-user

Il parametro AuthUserFile indica il percorso assoluto del file .htpasswd, che può essere anche in una directory diversa.
Ad esempio è possibile creare diversi .htaccess per proteggere directory diverse ma che utilizzano un unico file .htpassw.

All'interno del file .htpasswd ci sono invece le coppie username:password (una per ogni riga) con cui è possibile accedere al sistema.
Le password non sono in chiaro ma devono essere criptate.
Ad esempio se vogliamo creare un utente "user1" con la password "password1" il file avrà questo aspetto:

user1:$apr1$num08fex$p9m0HMyKjmNwExNMFpYEO0

Per criptare le password è possibile utilizzare una funzione PHP come la seguente (sulla base della risposta su stackoverflow che si può vedere qui):

function crypt_apr1_md5($plainpasswd, $salt = null)
{
 $tmp = "";
 if ($salt == null)
  $salt = substr(str_shuffle("abcdefghijklmnopqrstuvwxyz0123456789"), 0, 8);
 $len = strlen($plainpasswd);
 $text = $plainpasswd . '$apr1$' . $salt;
 $bin = pack("H32", md5($plainpasswd . $salt . $plainpasswd));
 for ($i = $len; $i > 0; $i -= 16)
 {
  $text .= substr($bin, 0, min(16, $i));
 }
 for ($i = $len; $i > 0; $i >>= 1)
 {
  $text .= ($i & 1) ? chr(0) : $plainpasswd{0};
 }
 $bin = pack("H32", md5($text));
 for ($i = 0; $i < 1000; $i++)
 {
  $new = ($i & 1) ? $plainpasswd : $bin;
  if ($i % 3)
   $new .= $salt;
  if ($i % 7)
   $new .= $plainpasswd;
  $new .= ($i & 1) ? $bin : $plainpasswd;
  $bin = pack("H32", md5($new));
 }
 for ($i = 0; $i < 5; $i++)
 {
  $k = $i + 6;
  $j = $i + 12;
  if ($j == 16)
   $j = 5;
  $tmp = $bin[$i] . $bin[$k] . $bin[$j] . $tmp;
 }
 $tmp = chr(0) . chr(0) . $bin[11] . $tmp;
 $tmp = strtr(strrev(substr(base64_encode($tmp), 2)), "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
 return "$" . "apr1" . "$" . $salt . "$" . $tmp;
}



// Inserire qui user e password
$user = 'user1';
$password = 'password1';

$crypt_pwd = crypt_apr1_md5($password);

// Output da inserire nel file .htpasswd
echo $user . ':' . $crypt_pwd;

 

Condividi questo post


Commenti