Page 1 sur 1

Vérification du codage de mes class

Posté : 11 mars 2014, 22:36
par nico44530
Bonjour,

J'aimerais savoir si mes class sont bien codées et sécurisées.
Je précise que tout fonctionne, donc si une modification est à faire, il faut que ça fonctionne de la même façon que sans la modification.

Merci d'avance ;)
<?php
include($_SERVER['DOCUMENT_ROOT'].'/include/define.inc.php');

// CLASS : Connexion à la base de données
class Bdd {
	private static $connexion = NULL;
	
	public static function connect(){
		if(!self::$connexion){
			self::$connexion = new PDO(DNS, USER, PASS);
			self::$connexion -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
			self::$connexion -> exec('SET NAMES utf8');
		}
		return self::$connexion;
	}
}

// CLASS : Vérification des sessions
class CheckSession {
	private static $pseudo = 0;
	private static $persistent = 0;

	public static function verif($pseudo, $persistent){
		if(isset($pseudo) || isset($persistent)){
			header('location: home');
			exit();
		}
	}
	public static function verifHome($pseudo, $persistent){
		if(!isset($pseudo) && !isset($persistent)){
			header('location: ../login.php?login_error=1');
			exit();
		}
	}
}

// CLASS : Cryptage
class Cryptage {
	public static function chaine($nb_car, $chaine='AZERTYUIOPQSDFGHJKLMWXCVBNazertyuiopqsdfghjklmwxcvbn123456789') {
		$nb_lettres = strlen($chaine)-1;
		$generation = '';
		for($i=0; $i < $nb_car; $i++)
		{
			$pos = mt_rand(0, $nb_lettres);
			$car = $chaine[$pos];
			$generation .= $car;
		}
		return $generation;
	}
}

// CLASS : Inscription
class Inscription {

}

// CLASS : Connexion
class Connexion {	
	public static function connexionCreate(){
		$email = htmlspecialchars($_POST['email']);
		$mdp = htmlspecialchars(sha1($_POST['mdp']));
		if(preg_match("!^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$!",$email)){
			if(!empty($_POST['email']) && !empty($_POST['mdp'])){
				$resultat = Bdd::connect() -> prepare(SELECT.ALL.USERS.LOGIN);
				$resultat -> execute(array('email' => $email,'mdp' => $mdp));
				$donnee = $resultat -> fetch(PDO::FETCH_ASSOC);
				if($resultat -> rowCount() === 1){
					$_SESSION['id'] = $donnee['id'];
					$_SESSION['pseudo'] = $donnee['pseudo'];
					header('location: home');
					$resultat -> closeCursor();
				} else {
					echo '<span class="error">Vos identifiants sont incorrects</span>';
				}
			} else {
				echo '<span class="error">Veuillez remplir tous les champs</span>';
			}
		} else {
			echo '<span class="error">Veuillez entrer une adresse électronique valide</span>';
		}
	}
	public static function recover($recoverEmail){
		$email = htmlspecialchars($_POST['recoverEmail']);
		if(preg_match("!^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$!",$email)){
			if(!empty($_POST['recoverEmail'])){
				$verifMail = Bdd::connect() -> prepare(SELECT.ALL.USERS.EMAIL);
				$verifMail -> execute(array('email' => $email));
				if($verifMail -> rowCount() === 1){
					$donnee = $verifMail -> fetch(PDO::FETCH_ASSOC);
					$newPass = Cryptage::chaine(8);
					$cryptPass = htmlspecialchars(sha1($newPass));
					$enregistrePass = Bdd::connect()->prepare(UPDATE.USERSZ.MAJPASS.EMAIL);
					$enregistrePass -> execute(array('newPass' => $cryptPass,'email' => $email));
					if(preg_match('#@(hotmail|live|msn).[a-z]{2,4}$#', $email)){
						$passage_ligne = "\n";
					} else {
						$passage_ligne = "\r\n";
					}
					$headers  = 'From: Web Astronomie <node12.cluster1.easy-hebergement.net>'.$passage_ligne;
					$headers .= 'Reply-to: Web Astronomie <node12.cluster1.easy-hebergement.net>'.$passage_ligne;
					$headers .= 'MIME-Version: 1.0'.$passage_ligne;
					$headers .= 'Content-Type: multipart/alternative;'.$passage_ligne;
					$sujet    = 'Mot de passe perdu';
					$message .= 'Content-Type: text/html; charset="ISO-8859-1"'.$passage_ligne;
					$message .= 'Content-Transfer-Encoding: 8bit'.$passage_ligne;
					$message  = 'Bonjour '.$donnee['prenom'].' '.$donnee['nom'].''.$passage_ligne;
					$message .= 'Voici votre nouveau mot de passe : '.$newPass.''.$passage_ligne;
					$message .= 'Cordialement,'.$passage_ligne;
					$message .= NAMESITE.''.$passage_ligne;
					if(mail($email, $sujet, $message, $headers)){
						echo '<span class="success">Un nouveau mot de passe viens de vous être envoyé</span>';
					} else {
						echo '<span class="error">Erreur lors de l\'envoie de votre mot de passe</span>';
					}
				} else {
					echo '<span class="error">Aucun compte n\'est associé à cette email :<br />'.$email.'</span>';
				}
			} else {
				echo '<span class="error">Veuillez remplir au moins un champ</span>';
			}
		} else {
			echo '<span class="error">Veuillez entrer une adresse électronique valide</span>';
		}
	}
}

// CLASS : Membres
class Membre {
	public static function info($id, $info){
		$resultat = Bdd::connect() -> prepare(SELECT.ALL.USERS.ID);
		$resultat -> execute(array('id' => $id));
		$infoMembre = $resultat -> fetch(PDO::FETCH_ASSOC);
		return $infoMembre[$info];
	}
}

// CLASS : Statut
class Statut {
	public static function sendStatut($user_id,$statut_text,$statut_acces,$statut_photo,$statut_etat){
		if(isset($statut_text) && !empty($statut_text)){
			$statut_text = trim(mysql_escape_string($_POST['statut_text']));
			if(($statut_acces == 'amis') || ($statut_acces == 'moi') || ($statut_acces == 'public')){
			$resultat = Bdd::connect() -> prepare(INSERT.USERSZ_STATUT.STATUTINSERT);
			$resultat -> execute(array('user_id' => $user_id,'statut_text' => $statut_text,'statut_acces' => $statut_acces,'statut_photo' => $statut_photo,'statut_etat' => $statut_etat));
			$avatar50 = $_SERVER['DOCUMENT_ROOT'].'/users/upload/avatars/'.Statut::newsPost('id').'-mini.jpg';
			$avatarDefault = Statut::newsPost('sexe') == 'homme' ? 'users/upload/avatars/homme.jpg' : 'users/upload/avatars/femme.jpg';
			echo '<li class="clearfix">';
			echo '<div class="statutAvatar arrow">';
			echo '<a href="'.Statut::newsPost('pseudo').'">';
			if(file_exists($avatar50)){ echo '<img src="users/upload/avatars/'.Statut::newsPost('id').'-mini.jpg" height="50" width="50" alt="" />'; } else { echo '<img src="'.$avatarDefault.'" height="50" width="50" alt="" />'; }
			echo '</a>';
			echo '</div>';
			echo '<div class="statutContent">';
			echo '<p>'.Statut::newsPost('statut_text').'</p>';
			echo '</div>';
			echo '</li>';
			} else {
				return false;
			}
		} else {
			return false;
		}
	}
	public static function displayStatut(){
		$resultat = Bdd::connect() -> prepare(SELECT.ALL.USERS_STATUT.' LEFT JOIN users ON users_statut.user_id = users.id ORDER BY statut_id DESC');
		$resultat -> execute();
		while($statut = $resultat -> fetch(PDO::FETCH_ASSOC)){
			$avatar50 = $_SERVER['DOCUMENT_ROOT'].'/users/upload/avatars/'.$statut['id'].'-mini.jpg';
			$avatarDefault = $statut['sexe'] == 'homme' ? 'users/upload/avatars/homme.jpg' : 'users/upload/avatars/femme.jpg';
			echo '<li class="clearfix">';
			echo '<div class="statutAvatar arrow">';
			echo '<a href="'.$statut['pseudo'].'">';
			if(file_exists($avatar50)){ echo '<img src="users/upload/avatars/'.$statut['id'].'-mini.jpg" height="50" width="50" alt="" />'; } else { echo '<img src="'.$avatarDefault.'" height="50" width="50" alt="" />'; }
			echo '</a>';
			echo '</div>';
			echo '<div class="statutContent">';
			echo '<p>'.$statut['statut_text'].'</p>';
			echo '</div>';
			echo '</li>';
		}
	}
	public static function newsPost($info){
		$resultat = Bdd::connect() -> prepare(SELECT.ALL.USERS_STATUT.' LEFT JOIN users ON users_statut.user_id = users.id ORDER BY statut_id DESC');
		$resultat -> execute();
		$infoPost = $resultat -> fetch(PDO::FETCH_ASSOC);
		return $infoPost[$info];
	}
}

?>

Re: Vérification du codage de mes class

Posté : 12 mars 2014, 20:00
par moogli
salut,

je n'ai regardé qu'en gros car trop de code.
- l'utilisation de globale en poo c'est le mal : un objet se doit d'être autonome avec un minimum de couplage / adhérence avec le reste de l'application
- le static c'est pas franchement ce qu'il y a de mieux
- tu manque d'un modèle objet cohérent.
Par exemple les classes dao devrait héritéde ta classe de connexion à la base de données

tu va me trouver vache mais globalement tu peux virer toute ta mécanique de classe qui ne sert strictement à rien et utiliser tes méthode en simple fonction procédurale cela fonctionnera aussi et tu compliquera moins la vie.

Je t'invite a trouver un cours sur la poo afin de mieux comprendre le principe. (par exemple http://fr.openclassrooms.com/informatiq ... que-la-poo c'est un peu light mais il y a une base).
ensuite tu pourras, si tu veux, regarder du coté de la modélisation (première étape pour concevoir l'application) par exemple avec uml (diagramme de classe tous ça).

si tu souhaite t'y investir autant le faire mais ne le fait juste pour faire de la poo ce n'est pas la peine ;)

@+

Re: Vérification du codage de mes class

Posté : 13 mars 2014, 00:23
par nico44530
Finalement, je vais faire ce que tu me dis, je vais recréer les fonctions de manière procédurale.
Je recoderais toutes les fonctions une par une depuis le début pour éviter de faire des erreurs de faille ou autre ;)

Ensuite j'aimerais savoir si utiliser "global" dans la fonction ci-dessous
function mafunction(){
...
//fonction de connexion à la base de donnée
...
}
ça permet d'éviter de réécrire les paramètres de connexion dans chaque fonction qu'on créer, et où l'insérer dans la fonction ?

Merci d'avance :)

Re: [RESOLU] Vérification du codage de mes class

Posté : 13 mars 2014, 17:44
par moogli
pas de globale, passage en argument, cela permet de ne gérer qu'une seule variable et pas x connexion dans chaque fonction (si tu oubli d'en fermer une c'est un coup à avoir plein de connexion ouverte en même temps c'est moyen, sens parler des perf qui vont être plutôt moyenne).

Tu peux très bien passer ton code en objet, mais avec un modèle correct dès le départ ;)

l'objet c'est une "philosophie" un peu particulière et peu naturel, c'est pour cela qu'il faut y aller petit a petit avec de bon tuto :)


@+

Re: [RESOLU] Vérification du codage de mes class

Posté : 14 mars 2014, 21:20
par nico44530
J'ai créé la fonction de connexion à la base de données :
function connect(){
		try{
			$connexion = new PDO(DNS, USER, PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
			$connexion -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
		} catch (Exception $e){
			echo 'Échec lors de la connexion : ' . $e->getMessage();
		}
		return $connexion;
}
Donc j'ai créé d'autres fonctions qui font appel à la connexion.
Fonction de connexion à l'espace membre par exemple :

Je suis obligé d'utiliser closeCursor() pour fermer la connexion ou c'est la fermeture de la fonction qui ferme automatiquement la connexion ?
function loginCreate($email, $mdp){
	$email = htmlspecialchars($_POST['email']);
	$mdp = htmlspecialchars(sha1($_POST['mdp']));
	if(preg_match("!^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$!",$email)){
		if(!empty($_POST['email']) && !empty($_POST['mdp'])){
			$resultat = connect() -> prepare(SELECT.ALL.USERS.LOGIN);
			$resultat -> execute(array('email' => $email,'mdp' => $mdp));
			$donnee = $resultat -> fetch(PDO::FETCH_ASSOC);
			if($resultat -> rowCount() === 1){
				$_SESSION['id'] = $donnee['id'];
				$_SESSION['pseudo'] = $donnee['pseudo'];
				header('location: home');
				$resultat -> closeCursor();
			} else {
				echo '<span class="error">Vos identifiants sont incorrects</span>';
			}
		} else {
			echo '<span class="error">Veuillez remplir tous les champs</span>';
		}
	} else {
		echo '<span class="error">Veuillez entrer une adresse électronique valide</span>';
	}
}
Donc problème résolu, je pense ;)

Re: [RESOLU] Vérification du codage de mes class

Posté : 14 mars 2014, 22:43
par moogli
Closecursor ne ferme pas la connexion c'est php qui le fait a la fin du script (via le ramasse miette).
Closecursor ferme un jeu de résultat ;)


Par contre il ne faut pas que tu appel cette fonction de connexion dans toutes les autres fonctions il faut que tu passe l'objet PDO en paramètres des autres fonctions.


@+

Re: [RESOLU] Vérification du codage de mes class

Posté : 28 mars 2014, 19:34
par nico44530
J'ai fais ça :
class Bdd {
	function connect(){
			try{
				$connexion = new PDO(DNS, USER, PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
				$connexion -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
			} catch (Exception $e){
				echo 'Échec lors de la connexion : ' . $e->getMessage();
			}
			return $connexion;
	}
}
Et dans ma requête :
$resultat = Bdd::connect() -> prepare(SELECT.ALL.USERS.LOGIN);
C'est bien ça ?