(Traduit
de l'article original www.zend.com/zend/tut/authentication.php)
Validation à partir d'un fichier à plat
Notre
fichier est constitué de la façon suivante:
joe:ai890d
jane:29hj0jk
mary:fsSS92
bob:2NNg8ed
dilbert:a76zFs
Nous
allons au sein de la boucle de lecture du fichier, comparer
les valeurs de $PHP_AUTH_USER et $PHP_AUTH_PW
.
Le flag $auth
est initialisé à faux
au début, si coïncidence est trouvée, ce
drapeau devient vrai ; en fin de boucle, si le drapeau est toujours
faux c'est que l'utilisateur n'est pas autorisé et on
affiche la boîte de dialogue.
Explication
du code source
- On
ouvre et lit le fichier "file.txt" dans la variable
$file_contents
.
- La
fonction "explode" éclate chaque ligne de
texte dans un élément du tableau
$lines
,
car nous savons que les lignes sont séparées<
par un caractère de nouvelle ligne "\n".
<?php
$auth = false; // Assume user is not authenticated
if (isset( $PHP_AUTH_USER ) && isset($PHP_AUTH_PW)) {
// Read the entire file into the variable $file_contents
$filename = '/path/to/file.txt';
$fp = fopen( $filename, 'r' );
$file_contents = fread( $fp, filesize( $filename ) );
fclose( $fp );
// Place the individual lines from the file contents into an array.
$lines = explode ( "\n", $file_contents );
// Split each of the lines into a username and a password pair
// and attempt to match them to $PHP_AUTH_USER and $PHP_AUTH_PW.
foreach ( $lines as $line ) {
list( $username, $password ) = explode( ':', $line );
if ( ( $username == "$PHP_AUTH_USER" ) &&
( $password == "$PHP_AUTH_PW" ) ) {
// A match is found, meaning the user is authenticated.
// Stop the search.
$auth = true;
break;
}
}
}
if ( ! $auth ) {
header( 'WWW-Authenticate: Basic realm="Private"' );
header( 'HTTP/1.0 401 Unauthorized' );
echo 'Authorization Required.';
exit;
} else {
echo '<P>You are authorized!</P>';
}
?>
Validation
à partir d'un fichier .htpasswd
Vous
savez sans doute déjà que les mots de passe dans
ce type de fichier ne sont pas en clair mais cryptés
par l'algorithme DES standard d'Unix. Notre fichier se présente
alors de la façon suivante:
joe:WvzodahMR9USk
jane:g3RYjX5evEvdM
julie:YzASzTGEo2VMA
Le
mot de passe de «joe» n'est pas «WvzodahMR9USk».
son mot de passe en clair est, je vous le dis «abba001»
et «zodahMR9USk» est la version cryptée par
DES de ce mot de passe, alors que «Wv» est le grain
de sel de la fonction crypt(). Ce grain de sel est nécessaire
pour la comparaison du mot de passe. On ne décrypte pas
les mots de passe ! On crypte la chaîne de caractères
candidate à être mot de passe avec le même
grain de sel et on compare le résultat avec la chaîne
cryptée stockée dans le fichier.
Explication
du code source
- On
compare le code utilisateur saisi avec celui obtenu par lecture
du fichier, si il ya concordance, on extrait le grain de sel
du mot de passe crypté et stocké, on crypte
le mot de passe saisi et on effectue la comparaison.
- Le
reste du script est identique.
<?php
$auth = false; // Assume user is not authenticated
if (isset( $PHP_AUTH_USER ) && isset($PHP_AUTH_PW)) {
// Read the entire file into the variable $file_contents
$filename = '/path/to/.htpasswd';
$fp = fopen( $filename, 'r' );
$file_contents = fread( $fp, filesize( $filename ) );
fclose( $fp );
// Place the individual lines from the file contents into an array.
$lines = explode ( "\n", $file_contents );
// Split each of the lines into a username and a password pair
// and attempt to match them to $PHP_AUTH_USER and $PHP_AUTH_PW.
foreach ( $lines as $line ) {
list( $username, $password ) = explode( ':', $line );
if ( $username == "$PHP_AUTH_USER" ) {
// Get the salt from $password. It is always the first
// two characters of a DES-encrypted string.
$salt = substr( $password , 0 , 2 );
// Encrypt $PHP_AUTH_PW based on $salt
$enc_pw = crypt( $PHP_AUTH_PW, $salt );
if ( $password == "$enc_pw" ) {
// A match is found, meaning the user is authenticated.
// Stop the search.
$auth = true;
break;
}
}
}
}
if ( ! $auth ) {
header( 'WWW-Authenticate: Basic realm="Private"' );
header( 'HTTP/1.0 401 Unauthorized' );
echo 'Authorization Required.';
exit;
} else {
echo '<P>You are authorized!</P>';
}
?>
Ps
: Ce source ne fonctionne qu'en PHP4 car la fonction foreach
n'existe pas en PHP3. Vous pouvez télécharger
le source .php3 ci-dessous. Afin d'en éviter la visualisation,
je lui ai ajouté une extension .ber qu'il vous suffit
d'enlever.