par
Ajoloca » 10 nov. 2006, 15:45
Ok zeus,
C'est une class en PHP 5 donc il ne sera pas utilisable sans adaptation en PHP 4.
J'ai écri ce code à mes débuts en PHP, donc soyez indulgeants mais les critiques sont acceptées.
<?php
/*
** REQUIS : PHP 5
**
** AUTEUR : José L.
** DATE : 17/03/2006
**
** Génère un mot de passe qui remplit les conditions suivantes :
** 1 majuscule, 1 minuscule, 1 chiffre, 1 caractère spécial, LG mini et LG maxi définies par les constantes MINI_LG_PASSWD et MAXI_LG_PASSWD
** On ne s'accupe pas de savoir si le mot est dans le dictionnaire (de n'importe quelle langue)
** vu qu'il comporte obligatoirement un chiffre et un caractère spécial
**
** MODIFICATIONS :
** AUTEUR :
** DATE :
*/
class Password{
const MINI_LG_PASSWD = 8;
const MAXI_LG_PASSWD = 16;
private $tmpPass = Array();
/* Caractères exclus, en fonction de la police => risque de confusion (dans l'ordre du tableau '$charsExclus')
Chiffres : 0, 1. Majus : I, L, O. Minus : i, l, o. Spéc : | (pipe), Le ! est exclu dans la fourchette
*/
private $charsExclus = Array(48, 49, 73, 76, 79, 105, 108, 111, 124);
private function _getValidChar($minVal, $maxVal){
while(true){
$asciiVal = mt_rand($minVal, $maxVal);
if(!in_array($asciiVal, $this->charsExclus)){
return (chr($asciiVal));
}
}
}
/*
** Constructeur
** @param : <$length> int
*/
public function __construct($_length = 8){
$_len = intVal($_length);
if($_len < self::MINI_LG_PASSWD || $_len > self::MAXI_LG_PASSWD){
throw new Exception ('La longueur doit etre comprise entre ' . self::MINI_LG_PASSWD . ' et ' . self::MAXI_LG_PASSWD . ' caracteres');
}
/*
Pour être sur qu'il rempli les conditions imposées
on génère em premier les 4 élémets pour les 4 conditions
*/
// Majuscules
array_push($this->tmpPass, $this->_getValidChar(65, 90));
// Minuscules
array_push($this->tmpPass, $this->_getValidChar(97, 122));
/* Chiffres
Pour les chiffres l'appel à la méhode _getValidChar() n'est pas obligatoire
(on exclu le 0 et le 1 dans la fourchette)
Mais pour une question d'homogénéité
*/
array_push($this->tmpPass, $this->_getValidChar(50, 57));
/* Comme les caractères spéciaux sont sur 4 plages et pour ne pas toujours utiliser la même
on va jouer sur le modulo de l'heure et minutes en cours
*/
$heure = date('Hi');
if($heure % 5 == 0){
array_push($this->tmpPass, $this->_getValidChar(33, 47));
}elseif($heure % 3 == 0){
array_push($this->tmpPass, $this->_getValidChar(58,64));
}elseif($heure % 2 == 0){
array_push($this->tmpPass, $this->_getValidChar(91, 96));
}else{
array_push($this->tmpPass, $this->_getValidChar(123, 126));
}
// On genère au hasar les valeurs restantes
while(count($this->tmpPass) < $_len){
array_push($this->tmpPass, $this->_getValidChar(34, 126));
}
/* Pour terminer on mélange le tableau pour nr pas avoir toujours
les 4 premiers caractères dans l'ordre de génération
*/
shuffle($this->tmpPass);
} //END-CONSTRUCT
/*
** Retourne le mot de passe généré
*/
public function getPassword(){
return(implode($this->tmpPass));
}
}
/*
** Exemple d'utilisation
*/
try{
$pass = new Password();
echo $pass->getPassword();
}catch (Exception $e){
echo $e->getMessage();
exit(1);
}
?>
Ok zeus,
C'est une class en PHP 5 donc il ne sera pas utilisable sans adaptation en PHP 4.
J'ai écri ce code à mes débuts en PHP, donc soyez indulgeants mais les critiques sont acceptées.
[php]<?php
/*
** REQUIS : PHP 5
**
** AUTEUR : José L.
** DATE : 17/03/2006
**
** Génère un mot de passe qui remplit les conditions suivantes :
** 1 majuscule, 1 minuscule, 1 chiffre, 1 caractère spécial, LG mini et LG maxi définies par les constantes MINI_LG_PASSWD et MAXI_LG_PASSWD
** On ne s'accupe pas de savoir si le mot est dans le dictionnaire (de n'importe quelle langue)
** vu qu'il comporte obligatoirement un chiffre et un caractère spécial
**
** MODIFICATIONS :
** AUTEUR :
** DATE :
*/
class Password{
const MINI_LG_PASSWD = 8;
const MAXI_LG_PASSWD = 16;
private $tmpPass = Array();
/* Caractères exclus, en fonction de la police => risque de confusion (dans l'ordre du tableau '$charsExclus')
Chiffres : 0, 1. Majus : I, L, O. Minus : i, l, o. Spéc : | (pipe), Le ! est exclu dans la fourchette
*/
private $charsExclus = Array(48, 49, 73, 76, 79, 105, 108, 111, 124);
private function _getValidChar($minVal, $maxVal){
while(true){
$asciiVal = mt_rand($minVal, $maxVal);
if(!in_array($asciiVal, $this->charsExclus)){
return (chr($asciiVal));
}
}
}
/*
** Constructeur
** @param : <$length> int
*/
public function __construct($_length = 8){
$_len = intVal($_length);
if($_len < self::MINI_LG_PASSWD || $_len > self::MAXI_LG_PASSWD){
throw new Exception ('La longueur doit etre comprise entre ' . self::MINI_LG_PASSWD . ' et ' . self::MAXI_LG_PASSWD . ' caracteres');
}
/*
Pour être sur qu'il rempli les conditions imposées
on génère em premier les 4 élémets pour les 4 conditions
*/
// Majuscules
array_push($this->tmpPass, $this->_getValidChar(65, 90));
// Minuscules
array_push($this->tmpPass, $this->_getValidChar(97, 122));
/* Chiffres
Pour les chiffres l'appel à la méhode _getValidChar() n'est pas obligatoire
(on exclu le 0 et le 1 dans la fourchette)
Mais pour une question d'homogénéité
*/
array_push($this->tmpPass, $this->_getValidChar(50, 57));
/* Comme les caractères spéciaux sont sur 4 plages et pour ne pas toujours utiliser la même
on va jouer sur le modulo de l'heure et minutes en cours
*/
$heure = date('Hi');
if($heure % 5 == 0){
array_push($this->tmpPass, $this->_getValidChar(33, 47));
}elseif($heure % 3 == 0){
array_push($this->tmpPass, $this->_getValidChar(58,64));
}elseif($heure % 2 == 0){
array_push($this->tmpPass, $this->_getValidChar(91, 96));
}else{
array_push($this->tmpPass, $this->_getValidChar(123, 126));
}
// On genère au hasar les valeurs restantes
while(count($this->tmpPass) < $_len){
array_push($this->tmpPass, $this->_getValidChar(34, 126));
}
/* Pour terminer on mélange le tableau pour nr pas avoir toujours
les 4 premiers caractères dans l'ordre de génération
*/
shuffle($this->tmpPass);
} //END-CONSTRUCT
/*
** Retourne le mot de passe généré
*/
public function getPassword(){
return(implode($this->tmpPass));
}
}
/*
** Exemple d'utilisation
*/
try{
$pass = new Password();
echo $pass->getPassword();
}catch (Exception $e){
echo $e->getMessage();
exit(1);
}
?>[/php]