= ADM_ERRCNX_TAILLE_MAX_FIC and $i < count($admcnxListeErreurs)) { if ($admcnxListeErreurs[$i] != "") { $admcnxListeErreurs[$i] = ""; $admcnxNombreErreurs--; } $i++; } } } return $admcnxLectureFicOK; } // Ajout d'une erreur de connexion dans la liste function ajouter_erreur_connexion () { global $admcnxLectureFicOK, $admcnxListeErreurs, $admcnxNombreErreurs; if ($admcnxLectureFicOK) { $heure = time(); $adresseIP = ""; if (isset($_SERVER['REMOTE_ADDR'])) $adresseIP = $_SERVER['REMOTE_ADDR']; $admcnxListeErreurs[] = $heure."|".date("d/m/Y H:i:s", $heure)."|".$adresseIP."\n"; $admcnxNombreErreurs++; } } // Renvoie vrai si le mode sécurisé (avec cryptogramme) est en vigueur function mode_securise () { global $admcnxLectureFicOK, $admcnxNombreErreurs; return ( (!$admcnxLectureFicOK or $admcnxNombreErreurs >= ADM_ERRCNX_N_ERREURS_MAX) and file_exists("extensions/cryptographp/cryptographp.php") and version_compare(PHP_VERSION, "4.3.2", ">=") ); } // Ecriture de la liste dans le fichier des erreurs de connexion function ecrire_fichier_erreurs_connexion () { global $admcnxLectureFicOK, $admcnxListeErreurs, $admcnxVerrouFicErr; $result = false; if ($admcnxLectureFicOK) { $result = file_put_contents(ADM_ERRCNX_NOM_FIC, $admcnxListeErreurs); } // Déverrouillage liberation_verrou($admcnxVerrouFicErr); $admcnxVerrouFicErr = false; return $result; } //----------------------------------------------------------------------------- // // Authentification des sessions PHP (gestion des clés de session) // //----------------------------------------------------------------------------- // Constantes define('ADM_AUTSES_NOM_FIC', dirname(__FILE__).'/admin/cles_sess.php'); // Nom du fichier de clés define('ADM_AUTSES_NOM_VERROU', dirname(__FILE__).'/admin/cles_sess.lock'); // Nom du fichier de verrou define('ADM_AUTSES_CLE_SESSION', 'CleSessionAdmin'); // Nom de la variable de session contenant la clé define('ADM_AUTSES_DUREE_VALIDITE_CLE_1', 10 * 60); // Durée de validité d'une clé réutilisable (en secondes) define('ADM_AUTSES_DUREE_REUTILISATION_CLE_1', 2 * 60); // Durée de réutilisation des clés (en secondes) define('ADM_AUTSES_DUREE_VALIDITE_CLE_2', 4 * 3600); // Durée de validité d'une clé à usage unique (en secondes) // // Vérification de la validité de la clé de session // // Permet de contrôler que la session a bien été créée par ce site. // function verifier_cle_session () { // Vérification de l'existence de la clé dans la session if (session_id() == "" or !isset($_SESSION[ADM_AUTSES_CLE_SESSION])) return false; // Verrouillage $verrou = acq_verrou_partage(ADM_AUTSES_NOM_VERROU); if ($verrou !== false) { // Lecture du fichier de clés $listeCles = lire_liste_cles_session(); // Déverrouillage liberation_verrou($verrou); $cleSession = $_SESSION[ADM_AUTSES_CLE_SESSION]; // Recherche de la clé dans la liste des clés valides $heure = time(); foreach ($listeCles as $cle) { if ($cle[0] == $cleSession and $cle[1] > $heure) { // La clé existe et la période de validité n'est pas écoulée return true; } } } return false; } // // Initialisation de la clé dans la session // // type_cle : // 1 : clé réutilisable (durée de vie courte) // 2 : clé à usage unique (durée de vie longue) // function initialiser_cle_session ($type_cle = 1) { if (session_id() == "") return false; $result = false; if ($type_cle < 1 or $type_cle > 2) $type_cle = 1; // Suppression de la clé dans la session unset($_SESSION[ADM_AUTSES_CLE_SESSION]); // Verrouillage $verrou = acq_verrou_exclusif(ADM_AUTSES_NOM_VERROU); if ($verrou !== false) { // Lecture du fichier de clés $listeCles = lire_liste_cles_session(); $listeModifiee = false; $cleSession = ""; if ($type_cle == 1) { // Recherche de la dernière clé réutilisable générée $heure = time(); for ($i = count($listeCles) - 1; $i >= 0 and $cleSession == ""; $i--) { $cle = $listeCles[$i]; // Si clé réutilisable et durée de réutilisation non écoulée if ($cle[2] > $heure) $cleSession = $cle[0]; } } if ($cleSession == "") { // Création d'une nouvelle clé do { // Génération d'une clé $cleSession = md5(microtime().mt_rand()); // Vérifie que la clé n'existe pas déjà (très improbable !) $trouve = false; foreach ($listeCles as $cle) { if ($cle[0] == $cleSession) $trouve = true; } } while ($trouve); $heure = time(); if ($type_cle == 2) { $finValidite = $heure + ADM_AUTSES_DUREE_VALIDITE_CLE_2; $finReutilisation = 0; // Non réutilisable } else { $finValidite = $heure + ADM_AUTSES_DUREE_VALIDITE_CLE_1; $finReutilisation = $heure + ADM_AUTSES_DUREE_REUTILISATION_CLE_1; } // Ajout de la nouvelle clé $listeCles[] = array($cleSession, $finValidite, $finReutilisation); $listeModifiee = true; } // Ecriture de la clé dans la session $_SESSION[ADM_AUTSES_CLE_SESSION] = $cleSession; // Ecriture du fichier de clés modifié if ($listeModifiee) ecrire_liste_cles_session($listeCles); // Déverrouillage liberation_verrou($verrou); $result = true; } return $result; } // // Suppression de la clé courante dans la session // function supprimer_cle_session () { // Vérification de l'existence de la clé dans la session if (session_id() == "" or !isset($_SESSION[ADM_AUTSES_CLE_SESSION])) return false; $cleSession = $_SESSION[ADM_AUTSES_CLE_SESSION]; // Suppression de la clé dans la session unset($_SESSION[ADM_AUTSES_CLE_SESSION]); // Verrouillage $verrou = acq_verrou_exclusif(ADM_AUTSES_NOM_VERROU); if ($verrou !== false) { // Lecture du fichier de clés $listeCles = lire_liste_cles_session(); $listeModifiee = false; // Suppression de la clé dans la liste (si elle est de type 2) $liste = array(); foreach ($listeCles as $cle) { if ($cle[0] != $cleSession or $cle[2] > 0) $liste[] = $cle; else $listeModifiee = true; } // Ecriture du fichier de clés modifié if ($listeModifiee) ecrire_liste_cles_session($liste); // Déverrouillage liberation_verrou($verrou); } return true; } // Lecture de la liste des clés dans le fichier de clés function lire_liste_cles_session () { // Lecture de la liste dans le fichier de clés $listeCles = array(); if (file_exists(ADM_AUTSES_NOM_FIC)) require(ADM_AUTSES_NOM_FIC); return $listeCles; } // Ecriture de la liste des clés dans le fichier de clés function ecrire_liste_cles_session ($listeCles) { // Purge des clés périmées dans la liste $liste = array(); $heure = time(); foreach ($listeCles as $cle) { if ($cle[1] > $heure) $liste[] = $cle; } $contenu = ""; // Ecriture de la liste dans le fichier de clés $result = file_put_contents(ADM_AUTSES_NOM_FIC, $contenu); return ($result !== false); } //----------------------------------------------------------------------------- ?>