Vous êtes sur la page 1sur 6

PHP

Création d'une admin protégée par un


.htaccess et un .htpasswd

php partie 4 - © S. Jeanneau sjcpi.fr Session École Multimédia - 2008 Page n° 1


.htaccess et .htpasswd

Les .htaccess permettent de sécuriser un tant soit peu un dossier.

Le fichier .htaccess va généralement faire référence à un fichier .htpasswd.

Le .htpasswd va contenir le login et le mot de passe séparés par 2 points :

exemple monLogin:monPassXYZ

Le mot de passe va être crypté pour que même lors de la lecture du fichier
.htpasswd en local le mot de passe ne soit pas accessible.

Créez un nouveau document creaHtaccess.php dans le dossier login

Dans ce document créez un formulaire qui va permettre la création des fichiers.

<form id="form1" name="form1" method="post" action="">


<p><br />
Login :
<input name="id" type="text" size="15" maxlength="15" />
</p>
<p>
cl&eacute;
<input name="clef" type="text" id="clef" size="2" maxlength="2" />
mot de passe
<input name="password" type="text" size="15" />
</p>
<p>
<input type="submit" name="crea" value="Envoyer" />
</p>
</form>

Le fichier .htaccess va faire référence au document .htpasswd et ce, de façon


absolue.

Le chemin absolu va être connu avec $_SERVER['DOCUMENT_ROOT']

sur mon ordinateur le chemin $_SERVER['DOCUMENT_ROOT'] est :

/Users/stephanejeanneau/web01/formations/_miniSitePhp

à ce chemin je vais ajouter l'endroit ou est stocké le .htpasswd .

/php/.htpasswd

Sous win le .htpasswd pourrait être stocké sous C:/.htpasswd et en clair


php partie 4 - © S. Jeanneau sjcpi.fr Session École Multimédia - 2008 Page n° 2
Contenu du fichier .htaccess

AuthUserFile va faire référence au document qui contient le login et mot de


passe, donc le fichier .htpasswd

AuthUserFile chemin/vers/le/fichier/.htpasswd

AuthName va afficher le message dans la fenêtre d'invite du navigateur.

AuthName "Acces Restreint"

AuthType va décider de la sécurité du login. L'autre méthode est digest pour


https à partir de php 5.1.0

AuthType Basic

<Limit GET POST>


require valid-user
</Limit>

Ces trois ligne vont décider de la méthode d'autentification

l'élément require valid-user


peut être remplacé par require user nomUtilisateur ou nomUtilisateur est un
login.

Une option supplémentaire peut être initialisée c'est celle du document à utiliser
lors d'une erreur.

Ces documents sont placés au niveau racine dans ces exemples. Notez aussi
que les ressources contenues dans ces docs doivent être en lien absolu.

Ces méthodes sont généralement placées au début du document.

ErrorDocument 405 /error405.php Méthode non autorisée


ErrorDocument 404 /error404.php Document non trouvé
ErrorDocument 403 /error403.php Interdit sans indication
ErrorDocument 401 /error401.php Identification requise
ErrorDocument 400 /error400.php Requête non comprise

Toutes les erreurs de Apache en français sur le site officiel :


http://www.apachefrance.com/Articles/7/imprime/

Un .htaccess peut aussi ne contenir que les indications vers une page d'erreur,
placé au niveau racine il vous permettra de personaliser vos pages d'erreur.

php partie 4 - © S. Jeanneau sjcpi.fr Session École Multimédia - 2008 Page n° 3


Éléments utilisés dans le formulaire

crypt

crypt va générer un chiffrage indéchiffrable (hashing)

variable = crypt ( $string , $salt );

crypt() retourne la chaîne str chiffrée avec l'algorithme standard Unix DES, ou
bien un des algorithmes disponibles sur la machine. L'argument optionnel salt
sera utilisé comme base pour le chiffrement.

Si l'argument salt n'est pas fourni, PHP en générera un lui-même, à chaque appel
à cette fonction. Dans notre cas le salt devra faire impérativement 2 caractères.
string quant à lui devra faire au moins 2 caractères, dans le formulaire il est
limité à 15 caractères maxi.

file_exists va vérifier si un fichier existe.

file_exists() retourne TRUE si le fichier filename existe, et FALSE sinon.

Sous Windows, utilisez le format de chemin //computername/share/filename ou


\\\\computername\share\filename pour vérifier qu'un fichier est disponible sur le
partage réseau.

$fichier = "testOpen.php";

if(!file_exists($fichier)){
echo "$fichier n'existe pas";
}else{
echo "$fichier existe";
}

fopen va gérer l'ouverture d'un fichier ou d'une URL. Si le fichier n'existe pas il
sera créé.

fopen($filename, $mode);

Liste des modes possibles pour la fonction fopen() en utilisant le paramètre $mode

'r' Ouvre en lecture seule, et place le pointeur de fichier au début du fichier.

'r+' Ouvre en lecture et écriture, et place le pointeur de fichier au début du


fichier.

'w' Ouvre en écriture seule ; place le pointeur de fichier au début du fichier et


réduit la taille du fichier à 0. Si le fichier n'existe pas, on tente de le créer.

php partie 4 - © S. Jeanneau sjcpi.fr Session École Multimédia - 2008 Page n° 4


'w+' Ouvre en lecture et écriture ; place le pointeur de fichier au début du
fichier et réduit la taille du fichier à 0. Si le fichier n'existe pas, on tente de le créer.

'a' Ouvre en écriture seule ; place le pointeur de fichier à la fin du fichier. Si le


fichier n'existe pas, on tente de le créer.

'a+' Ouvre en lecture et écriture ; place le pointeur de fichier à la fin du fichier.


Si le fichier n'existe pas, on tente de le créer.

'x' Crée et ouvre le fichier en lecture seule ; place le pointeur de fichier au


début du fichier. Si le fichier existe déjà, fopen() va échouer, en retournant FALSE et
en générant une erreur de niveau E_WARNING. Si le fichier n'existe pas, fopen()
tente de le créer. Cette option est supportée à partir de PHP 4.3.2 et fonctionne
uniquement avec des fichiers locaux.

'x+' Crée et ouvre le fichier en lecture et écriture ; place le pointeur de fichier


au début du fichier. Si le fichier existe déjà, fopen() va échouer, en retournant FALSE
et en générant une erreur de niveau E_WARNING. Si le fichier n'existe pas, fopen()
tente de le créer.Cette option est supportée à partir de PHP 4.3.2 et fonctionne
uniquement avec des fichiers locaux.

fopen("testOpen.php",'w+');

fseek va modifier la position du pointeur de fichier.

fseek(0); va placer le pointeur en début de fichier.

fputs($handle , $string, $length)


fputs écrit le contenu de la chaîne string dans le fichier pointé par handle . Si la
longueur length est fournie, l'écriture s'arrêtera après length octets, ou à la fin
de la chaîne (le premier des deux).

fflush($handle);
fflush va envoyer tout le contenu généré ($handle) dans un fichier. $handle est
un fichier ouvert avec fopen().

fclose ( $handle )
fclose() va fermer le fichier handle ouvert avec fopen();
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.

chdir($nomDuDossier);
chdir va changer le dossier courant pour $nomDuDossier.

chdir('../php/');

php partie 4 - © S. Jeanneau sjcpi.fr Session École Multimédia - 2008 Page n° 5


<?
$fichierHtaccess = ".htaccess";
$fichierPassword = ".htpasswd";
$racine = $_SERVER['DOCUMENT_ROOT'];

if(isset($_POST['crea']) && isset($_POST['clef']) && isset($_POST['password']) &&


isset($_POST['id'])){

$clef = $_POST['clef'];
$password = $_POST['password'];
$id = $_POST['id'];

$mdpCrypt = crypt($password, $clef);


$mssg = "L'admin est protégée par login et mot de passe<br />Le login est
$id le mot de passe est $password, celui crypté est : $mdpCrypt<br />";

if(!file_exists($fichierHtaccess)){
//
fopen($fichierHtaccess,'w+');

$fichierHtaccessEcrit = fopen($fichierHtaccess,'r+');
//retour au début du doc
fseek($fichierHtaccessEcrit,0);

//puis ajoute le code dans le doc


$ecriture = "AuthUserFile $racine/php/.htpasswd\nAuthName \"Acces
Restreint\"\nAuthType Basic\n<Limit GET POST>\nrequire valid-user\n</Limit>";
fputs($fichierHtaccessEcrit,$ecriture);

//envoie les données


fflush($fichierHtaccessEcrit);

//ferme le doc
fclose($fichierHtaccessEcrit);
}
///---
chdir('../php/');
if(!file_exists($fichierPassword)){
//
fopen($fichierPassword,'w+');

$fichierPasswordEcrit = fopen($fichierPassword,'r+');
//retour au début du doc
fseek($fichierPasswordEcrit,0);

//puis ajoute le code dans le doc


$ecriturePw = $id.":".$mdpCrypt;
fputs($fichierPasswordEcrit,$ecriturePw);

//envoie les données


fflush($fichierPasswordEcrit);

//ferme le doc
fclose($fichierPasswordEcrit);

chdir('../login/');

}
}else{
$mssg = "Entrez des données dans chaque champ activez le bouton et souvenez vous de
l'id et du mot de passe.";
}
echo "<h3>".$mssg."</h3>";
?>

php partie 4 - © S. Jeanneau sjcpi.fr Session École Multimédia - 2008 Page n° 6

Vous aimerez peut-être aussi