Bouts de Codes PHP

Gestion des mots de passe .htpasswd

Information sur le code source PHP

Ecrit par :  forty
Site de l'auteur Voir
Codes en PHP de l'auteur : [19] sources Voir
Enregistrement le 01 Mai 2008 - Vu 3609 fois
Impression: Imprimer le code
Pas encore
de vote

Description du code source

Information 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
.322
 

<?php
/******************************************************************************/
/*                                                                            */
/*                       __        ____                                       */
/*                 ___  / /  ___  / __/__  __ _____________ ___               */
/*                / _ \/ _ \/ _ \_\ \/ _ \/ // / __/ __/ -_|_-<               */
/*               / .__/_//_/ .__/___/\___/\_,_/_/  \__/\__/___/               */
/*              /_/       /_/                                                 */
/*                                                                            */
/*                                                                            */
/******************************************************************************/
/*                                                                            */
/* Titre          : Gestion des mots de passe .htpasswd                       */
/*                                                                            */
/* URL            : http://www.phpsources.org/scripts379-PHP.htm              */
/* Auteur         : forty                                                     */
/* 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 ?>
            <td><input type="reset" name="reset" value="Annuler"
 onclick="javascript:history.back()"></td>
        </tr>
    </table>
</form>
</body>
</html>
Fonctions du code source

Fonctions php / mysql PHP

  • define : Définit une constante - (PHP 4, PHP 5)
  • dirname : Renvoie le nom du dossier - (PHP 4, PHP 5)
  • fopen : Ouvre un fichier ou une URL - (PHP 4, PHP 5)
  • fputs : Alias de fwrite() - (PHP 4, PHP 5)
  • strlen : Calcule la taille d'une chaîne - (PHP 4, PHP 5)
  • fclose : Ferme un fichier - (PHP 4, PHP 5)
  • empty : Détermine si une variable contient une valeur non nulle - (PHP 4, PHP 5)
  • gethostbyaddr : Retourne le nom d'hôte correspondant à une IP - (PHP 4, PHP 5)
  • mail : Envoi de mail - (PHP 4, PHP 5)
  • isset : Détermine si une variable est affectée - (PHP 4, PHP 5)
  • explode : Coupe une chaîne en segments - (PHP 4, PHP 5)
  • str_replace : Remplace toutes les occurrences dans une chaîne - (PHP 4, PHP 5)
  • str_shuffle : Mélange les caractères d'une chaîne de caractères - (PHP 4 >= 4.3.0, PHP 5)
  • substr : Retourne un segment de chaîne - (PHP 4, PHP 5)
  • md5 : Calcule le md5 d'une chaîne - (PHP 4, PHP 5, PECL hash:1.1-1.3)
  • pack : Compacte des données dans une chaîne binaire - (PHP 4, PHP 5)
  • min : La plus petite valeur - (PHP 4, PHP 5)
  • chr : Retourne un caractère spécifique - (PHP 4, PHP 5)
  • base64_encode : Encode une chaîne en MIME base64 - (PHP 4, PHP 5)
  • strrev : Inverse une chaîne - (PHP 4, PHP 5)
  • strtr : Remplace des caractères dans une chaîne - (PHP 4, PHP 5)
  • file_exists : Vérifie si un fichier ou un dossier existe - (PHP 4, PHP 5)
  • echo : Affiche une chaîne de caractères - (PHP 4, PHP 5)
  • copy : Copie un fichier - (PHP 4, PHP 5)
  • feof : Teste la fin du fichier - (PHP 4, PHP 5)
  • fgets : Récupère la ligne courante sur laquelle se trouve le pointeur du fichier - (PHP 4, PHP 5)
  • strpos : Trouve la position d'un caractère dans une chaîne - (PHP 4, PHP 5)
  • strcmp : Comparaison binaire de chaînes - (PHP 4, PHP 5)
  • die : Alias de la fonction exit() - (PHP 4, PHP 5)

Poster un commentaire

:P :)
:wink: :lol:
:surprised: :confused:
:idea: :no:
Taille du texte:
Couleur:
 
Code de sécurité
Offres d'emploi
Librairie

Langages de programmation

La librairie est ouverte à tous et elle est accès principalement sur les langages PHP et MySQL. Vous trouverez aussi d'autres langages de programmation tel que le CSS, HTML, AJAX, ASP.. Plus de 300 références facilement accessibles. Visiter

  • PHP / MySQL avec Flash 8
  • HTML 4 : Maîtrisez le code source
  • PHP 6 et MySQL 5 : Créez des sites Web dynamiques
  • MySQL 4
  • PHP et MySQL
  • HTML
  • Les Mysteres de Php et Mysql
  • PHP 5 et Apache 2 : Maîtrisez le développement et le déploiement de votre site web interactif
  • PHP 5 - MySQL 5 - Ajax - Entrainez-vous à créer des applications professionnelles
  • Total HTML