.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, $contenu, strlen($contenu)) == false) {
return 'Impossible d\'é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_HTPASSWD, FILE_HTPASSWD_SAVE)
) { // Sauvegarde le fichier
$message .= 'La copie du fichier ' . FILE_HTPASSWD . ' en ' .
FILE_HTPASSWD_SAVE . " n'a pas réussi...\n";
} else {
$insere = false;
$handle = fopen(FILE_HTPASSWD, 'r'); // Ouvre le fichier en lecture
if ($handle) {
while (!feof($handle)) {
$buffer = fgets($handle, 4096);
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ésent deux fois :
supprime le deuxième.\n";
}
} elseif ($difference < ) { // Trié par ordre alphabétique
if ($insere == false) {
$contenu .= $login . ':' . $pass_crypte . "\n";
$resultat = "Cré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é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_HTPASSWD, FILE_HTPASSWD_SAVE)
) { // Sauvegarde le fichier
$message .= "La copie du fichier " . FILE_HTPASSWD . ' en ' .
FILE_HTPASSWD_SAVE . " n'a pas réussi...\n";
} else {
$supprime = false;
$handle = fopen(FILE_HTPASSWD, 'r'); // Ouvre le fichier en lecture
if ($handle) {
while (!feof($handle)) {
$buffer = fgets($handle, 4096);
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ésent deux fois :
supprime aussi le deuxiè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é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égée"
AuthUserFile "<?php echo str_replace('\\', '/', FILE_HTPASSWD); ?>"
AuthGroupFile "/dev/null"
AuthType Basic
<limit GET POST>
require valid-user
</limit>
# 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 } |