Accès au manager - réservé aux membres

Navigation

Bouts de Codes PHP

Gestion des mots de passe .htpasswd

Informations sur le code source PHP

Ecrit par :  lamogere
Site de l'auteur Voir
Autres codes en PHP de l'auteur : [13] sources Voir
Date d'enregistrement du code le 01 Mai 2008 - Vu 1460 fois
Code source zippé: Télécharger le fichier ZIP
Impression: Imprimer le code
Ajouter la page à vos favoris

Description du code source

Informations sur le code source

Ce script permet de gérer les utilisateurs et leur mot de passe pour un administrateur. Il permet de créer,modifier ou supprimer un utilisateur dans un fichier .htpasswd
Il est uniquement possible de modifier le mot de passe pour un utilisateur autre que l'administrateur.
Ce script utilise le cryptage APR1 MD5 compatible avec WAMP sous windows.
A chaque modification, un mail est envoyé à l'administrateur.
Il est également possible de garder une copie de sauvegarde du fichier .htpasswd
Le code à ajouter dans le fichier .htaccess est indiqué.
Il suffit juste de paramétrer les 4 constantes en haut du script :
- ADMIN_NAME : nom de l'administrateur,
- FILE_HTPASSWD : chemin du fichier .htpasswd,
- FILE_HTPASSWD_SAVE : chemin du fichier .htpasswd de sauvegarde (ou vide),
- EMAIL_MASTER : email qui reçoit les mails en cas de modification.

Code Source



.01
.02
.03
.04
.05
.06
.07
.08
.09
.10
.11
.12
.13
.14
.15
.16
.17
.18
.19
.20
.21
.22
.23
.24
.25
.26
.27
.28
.29
.30
.31
.32
.33
.34
.35
.36
.37
.38
.39
.40
.41
.42
.43
.44
.45
.46
.47
.48
.49
.50
.51
.52
.53
.54
.55
.56
.57
.58
.59
.60
.61
.62
.63
.64
.65
.66
.67
.68
.69
.70
.71
.72
.73
.74
.75
.76
.77
.78
.79
.80
.81
.82
.83
.84
.85
.86
.87
.88
.89
.90
.91
.92
.93
.94
.95
.96
.97
.98
.99
.100
.101
.102
.103
.104
.105
.106
.107
.108
.109
.110
.111
.112
.113
.114
.115
.116
.117
.118
.119
.120
.121
.122
.123
.124
.125
.126
.127
.128
.129
.130
.131
.132
.133
.134
.135
.136
.137
.138
.139
.140
.141
.142
.143
.144
.145
.146
.147
.148
.149
.150
.151
.152
.153
.154
.155
.156
.157
.158
.159
.160
.161
.162
.163
.164
.165
.166
.167
.168
.169
.170
.171
.172
.173
.174
.175
.176
.177
.178
.179
.180
.181
.182
.183
.184
.185
.186
.187
.188
.189
.190
.191
.192
.193
.194
.195
.196
.197
.198
.199
.200
.201
.202
.203
.204
.205
.206
.207
.208
.209
.210
.211
.212
.213
.214
.215
.216
.217
.218
.219
.220
.221
.222
.223
.224
.225
.226
.227
.228
.229
.230
.231
.232
.233
.234
.235
.236
.237
.238
.239
.240
.241
.242
.243
.244
.245
.246
.247
.248
.249
.250
.251
.252
.253
.254
.255
.256
.257
.258
.259
.260
.261
.262
.263
.264
.265
.266
.267
.268
.269
.270
.271
.272
.273
.274
.275
.276
.277
.278
.279
.280
.281
.282
.283
.284
.285
.286
.287
.288
.289
.290
.291
.292
.293
.294
.295
.296
.297
.298
.299
.300
.301
.302
.303
.304
.305
.306
.307
.308
.309
.310
.311
.312
.313
.314
.315
.316
.317
.318
.319
.320
.321
 

<?php
/******************************************************************************/
/*                                                                            */
/*                       __        ____                                       */
/*                 ___  / /  ___  / __/__  __ _____________ ___               */
/*                / _ \/ _ \/ _ \_\ \/ _ \/ // / __/ __/ -_|_-<               */
/*               / .__/_//_/ .__/___/\___/\_,_/_/  \__/\__/___/               */
/*              /_/       /_/                                                 */
/*                                                                            */
/*                                                                            */
/******************************************************************************/
/*                                                                            */
/* Titre          : Gestion des mots de passe .htpasswd                       */
/*                                                                            */
/* URL            : http://www.phpsources.org/scripts379-PHP.htm              */
/* Auteur         : lamogere                                                  */
/* Date édition   : 01 Mai 2008                                               */
/* Website auteur : http://www.toplien.fr/                                    */
/*                                                                            */
/******************************************************************************/

//Nom du gestionnaire du fichier .htpasswd
define('ADMIN_NAME''admin');

//Chemin du fichier .htpasswd
define('FILE_HTPASSWD'dirname(__FILE__) . '/.htpasswd');
//Si vous souhaitez sauvergarder le fichier .htpasswd avant chaque modification
// il faut renseigner le chemin d'un fichier de sauvagarde
define('FILE_HTPASSWD_SAVE''');

//Mail du webmaster
define('EMAIL_MASTER'$_SERVER['SERVER_ADMIN']);

//ecrit dans un fichier
function ecrire_fichier($nom_fichier$contenu) {
  if (($handle fopen($nom_fichier'w')) !== false) {
    if (fputs($handle$contenustrlen($contenu)) == false) {
      return 'Impossible d\'&eacute;crire "' $contenu '" dans le fichier (' 
$nom_fichier ").\n";
    }
    fclose($handle);
    return '';
  } else {
    return 'Erreur d\'ouverture du fichier ' $nom_fichier ".\n";
  }
}

//envoye un mail a l'administrateur
function envoyer_mail($sujet) {
  global $login$pass$pass_crypte$message;
  
  $corps  "\nuser : " $login;
  $corps .= "\nMot de passe : " $pass;
  $corps .= "\nLigne htpasswd : " $login ':' $pass_crypte;
  $corps .= "\n\nRemote user : " $_SERVER['REMOTE_USER'];
  $corps .= "\nMessage : " $message;
  if (!empty($_SERVER['HTTP_REFERER'])) {
    $corps .= "\nProvenance : " $_SERVER['HTTP_REFERER'];
  }
  $corps .= "\nPage : " get_complete_url();
  if (!empty($_SERVER['HTTP_USER_AGENT'])) {
    $corps .= "\nNavigateur : " $_SERVER['HTTP_USER_AGENT'];
  }
  $corps .= "\nAdresse IP : " $_SERVER['REMOTE_ADDR'];
  $corps .= "\nNom de domaine : ".gethostbyaddr($_SERVER['REMOTE_ADDR']);
  @mail($_SERVER['HTTP_HOST'] . '<' EMAIL_MASTER '>'$sujet$corps'From: ' $_SERVER['HTTP_HOST'] . '<' EMAIL_MASTER '>');
}

// retourne l'url complète de la page courante (avec ou sans les paramètres)
function get_complete_url($sansparam false) {
  if ($sansparam) {
    if (isset($_SERVER['SCRIPT_URI'])) {
      return $_SERVER['SCRIPT_URI'];
    } else {
      $uri explode('?'$_SERVER['REQUEST_URI']);
      return 'http://' $_SERVER['HTTP_HOST'] . $uri[];
    }
  } else {
    if (isset($_SERVER['SCRIPT_URL']) && isset($_SERVER['REQUEST_URI']) && isset
($_SERVER['SCRIPT_URI'])) {
      return str_replace($_SERVER['SCRIPT_URL'], $_SERVER['REQUEST_URI'], 
$_SERVER['SCRIPT_URI']);
    } else {
      return 'http://' $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    }
  }
}

// http://fr.php.net/manual/fr/function.crypt.php#73619
function crypt_apr1_md5($plainpasswd) {
  $salt substr(str_shuffle("abcdefghijklmnopqrstuvwxyz0123456789"), , 8);
  $len strlen($plainpasswd);
  $text $plainpasswd.'$apr1$'.$salt;
  $bin pack("H32"md5($plainpasswd.$salt.$plainpasswd));
  for($i $len$i > ; $i -= 16) { $text .= substr($bin, , min(16$i)); }
  for($i $len$i > ; $i >>= 1) { $text .= ($i 1) ? chr() : $plainpasswd{}; 
}
  $bin pack("H32"md5($text));
  for($i = ; $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 = ; $i 5$i++) {
    $k $i 6;
    $j $i 12;
    if ($j == 16$j 5;
    $tmp $bin[$i].$bin[$k].$bin[$j].$tmp;
  }
  $tmp chr().chr().$bin[11].$tmp;
  $tmp strtr(strrev(substr(base64_encode($tmp), 2)),
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
  "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
  return "$"."apr1"."$".$salt."$".$tmp;
}

// Si le script n'est pas protégé par un fichier .htpasswd le script est
// considéré être lancé par l'administrateur.
$user_logged = empty($_SERVER['REMOTE_USER']) ? ADMIN_NAME $_SERVER['REMOTE' .
'_USER'];

if (isset($_POST['login']) && isset($_POST['pass'])) {
  $login $_POST['login'];
  $pass $_POST['pass'];
  if (!file_exists(FILE_HTPASSWD)) { //si la page existe dans le cache
    echo ecrire_fichier(FILE_HTPASSWD'# Fichier des mots de passe généré' .
' avec ' get_complete_url(false) . "\n");
  }
  $resultat  '';
  $message '';
  $contenu '';
  if (isset($_POST['update'])) {
    $pass_crypte crypt_apr1_md5($pass); // On crypte le mot de passe
    if (($user_logged == ADMIN_NAME) || ($user_logged == $login)) {
      if ((FILE_HTPASSWD_SAVE != '') && !copy(FILE_HTPASSWDFILE_HTPASSWD_SAVE)
) {  // Sauvegarde le fichier
        $message .= 'La copie du fichier ' FILE_HTPASSWD ' en ' FILE_HTPASSWD_SAVE " n'a pas r&eacute;ussi...\n";
      } else {
        $insere false;
        $handle fopen(FILE_HTPASSWD'r'); // Ouvre le fichier en lecture
        if ($handle) {
          while (!feof($handle)) {
            $buffer fgets($handle4096);
            if ((strlen($buffer) > ) && (($pos strpos($buffer':'1)) > )) {
              $utilisateur substr($buffer, , $pos);
              if (($difference strcmp($login$utilisateur)) == ) {  
// User existe déjà
                if ($insere == false) {
                  $contenu .= $login ':' $pass_crypte "\n";
                  $resultat "Modification du mot de passe de l'utilisateur 
$login.\n";
                  $message .= $resultat;
                  $insere true;
                } else {
                  $message .= "Utilisateur $login pr&eacute;sent deux fois : 
supprime le deuxi&egrave;me.\n";
                }
              } elseif ($difference < ) {  // Trié par ordre alphabétique
                if ($insere == false) {
                  $contenu .= $login ':' $pass_crypte "\n";
                  $resultat "Cr&eacute;ation du mot de passe de l'utilisateur 
$login.\n";
                  $message .= $resultat;
                  $insere true;
                }
                $contenu .= $buffer;
              } else {
                $contenu .= $buffer;
              }
            } else {
              $contenu .= $buffer;
            }
          }
          if ($insere == false) {  // Ajoute en dernière position si pas déjà
// ajouté
            $contenu .= $login ':' $pass_crypte "\n";
            $resultat "Cr&eacute;ation du mot de passe de l'utilisateur $login
.\n";
            $message .= $resultat;
            $insere true;
          }
          fclose($handle);
        } else {
          $message .= 'Erreur d\'ouverture du fichier ' FILE_HTPASSWD ".\n";
        }
        $message .= ecrire_fichier(FILE_HTPASSWD$contenu);
      }
      envoyer_mail('Changement de mot de passe');
    } else {
      echo "Pas d'autorisation de modification du mot de passe de l'utilisateur 
$login.\n";
    }
  } elseif (isset($_POST['delete'])) {
    if (($user_logged == ADMIN_NAME) && ($login != ADMIN_NAME)) {  // Pas de
// suppression si pas ADMIN_NAME et pas de suppression du user ADMIN_NAME
      if ((FILE_HTPASSWD_SAVE != '') && !copy(FILE_HTPASSWDFILE_HTPASSWD_SAVE)
) {  // Sauvegarde le fichier
        $message .= "La copie du fichier " FILE_HTPASSWD ' en ' FILE_HTPASSWD_SAVE " n'a pas r&eacute;ussi...\n";
      } else {
        $supprime false;
        $handle fopen(FILE_HTPASSWD'r'); // Ouvre le fichier en lecture
        if ($handle) {
          while (!feof($handle)) {
            $buffer fgets($handle4096);
            if ((strlen($buffer) > ) && (($pos strpos($buffer':'1)) > )) {
              $utilisateur substr($buffer, , $pos);
              $pass_crypte substr($buffer$pos 1);
              if ($login == $utilisateur) {  // User existe 
                if ($supprime == false) {
                  $resultat "Suppression de l'utilisateur $login.\n";
                  $message .= $resultat;
                  $supprime true;
                } else {
                  $message .= "Utilisateur $login pr&eacute;sent deux fois : 
supprime aussi le deuxi&egrave;me.\n";
                }
              } else {
                $contenu .= $buffer;
              }
            } else {
              $contenu .= $buffer;
            }
          }
          if ($supprime == false) {  // Utilisateur n'existe pas
            $resultat "L'utilisateur $login n'existe pas dans le fichier.\n";
            $message .= $resultat;
          }
          fclose($handle);
        } else {
          $message .= "Erreur d'ouverture du fichier " FILE_HTPASSWD ".\n";
        }
        $message .= ecrire_fichier(FILE_HTPASSWD$contenu);
      }
      envoyer_mail('Suppression d\'utilisateur'); 
    } else {
      echo "Pas d'autorisation de supprimer l'utilisateur $login.\n";
    }
  } else {
    die("Action \"$submit\" inconnue.\n");
  }
  die ($resultat);
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
 "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<?php
if ($user_logged == ADMIN_NAME) {
?>
<title>Gestion des utilisateurs et de leur mot de passe</title>
<?php } else { ?>
<title>Modification du mot de passe</title>
<?php ?>
<meta name="robots" content="noindex, follow">
</head>
<body>
<?php if ($user_logged == ADMIN_NAME) { ?>
<?php   if (empty($_SERVER['REMOTE_USER'])) { ?>
<p>Prot&eacute;gez ce script par un fichier .htpasswd!!!</p>
<?php   ?>
<p>Pour utiliser le fichier .htpasswd, il faut ajouter les lignes suivantes dans
 un fichier .htaccess :</p>
<pre>
# Début protection par mot de passe
Authname "Zone prot&eacute;g&eacute;e"
AuthUserFile "<?php echo str_replace('\\''/'FILE_HTPASSWD); ?>"
AuthGroupFile "/dev/null"
AuthType Basic
&lt;limit GET POST&gt;
require valid-user
&lt;/limit&gt;
# Fin protection par mot de passe</pre>
<?php ?>
<form method="post" action="">
<?php if ($user_logged == ADMIN_NAME) { ?>
    <table>
        <tr>
            <td><label for="login" accesskey="L">Login</label></td>
            <td><input type="text" name="login" id="login"></td>
        </tr>
        <tr>
            <td><label for="pass" accesskey="P">Mot de passe</label></td>
            <td><input type="text" name="pass" id="pass"></td>
        </tr>
    </table>
    <table>
        <tr>
            <td><input type="submit" name="update" value="Modifier"></td>
            <td><input type="submit" name="delete" value="Supprimer"
 onclick="javascript:return confirm('Etes-vous sur de supprimer cet utilisateur
 ?');"></td>
<?php } else { ?>
    <table>
        <tr>
            <td><label for="login" accesskey="L">Login</label></td>
            <td><input type="text" name="login" value="<?php echo $user_logged?>
" readonly id="login"></td>
        </tr>
        <tr>
            <td><label for="pass" accesskey="P">Mot de passe</label></td>
            <td><input type="text" name="pass" id="pass"></td>
        </tr>
    </table>
    <table>
        <tr>
            <td><input type="submit" name="update" value="Modifier"></td>
<?php