Verification de la securite des requetes sql

JejeScript - 27 déc. 2012 à 21:58
 JejeScript - 27 déc. 2012 à 22:03
Bonjour à tous,

Je recommence un projet, et c'est la première fois que j'utilise PDO, j'aurai besoin de vos conseil concernant la sécurité des requêtes vers la bdd.

voici la page define.php
<?php
include('config.php');
// variables de connexion
define('DNS', 'mysql:host='.$PARAM_hote.';dbname='.$PARAM_nom_bd);
define('USER', $PARAM_utilisateur);
define('PASS', $PARAM_mot_passe);
// base site
define('NOMSITE', $PARAM_nom_site);
define('MAILSITE', $PARAM_mail_site);
define('URLSITE', $PARAM_url_site);
// base sql
define('SELECT', 'SELECT ');
define('UPDATE', 'UPDATE ');
define('INSERT', 'INSERT INTO ');
define('DELETE', 'DELETE ');
define('ALL', '*');
// les tables
define('MEMBRE', ' FROM JejeScriptMembres');
define('JETON', ' FROM JejeScriptSecure');
define('ACTIVATION', ' FROM JejeScriptActivation');
define('JETONMAIL', ' FROM JejeSciptActivationMail');
// les tables sans FROM
define('JETONZ', 'JejeScriptSecure');
// les variables de recherche sur la table membres
define('ID', ' WHERE id=:id');
define('LOGIN', ' WHERE pseudo=:login');
define('ACTIVMEMBRE', ' SET activaion=:activer');
// les variables de recherche sur la table methode d'activation
define('METHODEACTIV', ' WHERE activation=1');
// les variables de recherche sur la table jeton de connexion
define('JETONCONNEXION', ' WHERE id_membre=:id AND ip_connexion=:ip');
define('JETONMEMBRE', ' WHERE id_membre=:id');
define('JETONDATE', ' SET date=:date');
define('JETONVALUES', ' (id_membre, jeton, ip_connexion, date) VALUES (:id, :jeton, :ip, :date)');
?>


et voici la page de classes et fonctions ou sont les fameuses requêtes :
<?php 
include('define.php');

// La fonction de redirection de base
function redirection($url, $time=0) {
if (!headers_sent()) {
header("refresh: $time;url=$url"); 
exit;
}
else {
echo '<meta http-equiv="refresh" content="',$time,';url=',$url,'">';
}
}

// La classe de connexion a la bdd
class Bdd {
private static $connexion = NULL;

public static function connectBdd() {
if(!self::$connexion) {
self::$connexion = new PDO(DNS, USER, PASS);
self::$connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
return self::$connexion;
}
} // Fin de la classe de connexion a la bdd

###########################################################################################

// La classe de recuperation de l'ip visiteur
class Ip {
// function recuperation ip
public static function get_ip() { 
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} 
elseif(isset($_SERVER['HTTP_CLIENT_IP'])) { 
$ip = $_SERVER['HTTP_CLIENT_IP'];
} 
else { 
$ip = $_SERVER['REMOTE_ADDR'];
} 
return $ip;
}
} // Fin de la classe de recuperation de l'ip visiteur

###########################################################################################

// La classe de cryptage
class Cryptage {

// Fonction de cryptage
public static function crypter($var) {
$sel = "48@tiOP";
$Cript = md5($var);
$crypt = sha1($Cript, $sel);
return $crypt;
}
// creation d'une chaine aleatoire
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;
}

}

// La classe captcha
class Captcha {

// Fonction de creation d'un captcha
// $a => chiffre entre 1 et 10
// $b => chiffre entre 1 et 10
// $resultat => le resultat de l'operation
// $phrase => le texte du captcha
// Retourne un tableau contenant la phrase et le resultat du captcha
public static function captchaCreate() {
$a = rand(1, 10);
$b = rand(1, 10);
$resultat = $a + $b;
$phrase = 'Combien font '.$a.' + '.$b.' : ';
return array($resultat, $phrase);
}
// Fonction d'envoie du captcha
// Creation d'une session contenant le resultat du captcha
// Retourne la phrase du captcha
public function captcha() {
list($resultat, $phrase) = Captcha::captchaCreate();
$_SESSION['captcha'] = $resultat;
return $phrase;
}
// Fonction de verification du resultat du captcha
// Si le resultat du captcha a ete poste
// 		Si la reponse est egale a la session captcha
// 			Retourne vrai
//		Si la reponse est fausse
// 			retourne faux
// Si le resultat n'est pas envoye
// 		Retourne faux
public static function captchaVerif() {
if(!empty($_POST['captcha'])) {
if($_POST['captcha'] == $_SESSION['captcha']) {
return true;
}
else {
return false;
}
}
else {
return false;
}
}
 
} // Fin de la classe captcha

###########################################################################################

// La classe connexion membre
class Connexion {

// fonction de connexion des membres
// Si verification du captcha => ok, et que l'identifiant et le mot de passe sont postes
// 		Si login existe 
//			Si mot de passe est ok 
//				Creation de la session
//				Enregistrement du jeton de connexion
//				Redirection vers page au choix
//					-> membre, moderateur, administrateur
//			Si mot de passe faux => retourne faux
// 		Si login existe pas => retourne faux
// Si le captcha est faux => retourne faux
public static function connexionCreate() {
if(Captcha::captchaVerif() AND !empty($_POST['login']) AND !empty($_POST['pass'])) {
if(Connexion::verifLogin($_POST['login'])) {
if(Connexion::verifPass($_POST['pass'], $_POST['login'])) {
$_SESSION['id'] = Membre::recupId($_POST['login']);
$_SESSION['jeton'] = Connexion::jeton($_POST['login']);
header('location : '.Connexion::niveau($_POST['login']));
}
else {
return false;
}
}
else {
return false;
}
}
else {
return false;
}
}
// Fonction de verification que l'identifiant existe dans la bdd
public static function verifLogin($login) {
$resultat = Bdd::connectBdd()->prepare(SELECT.ALL.MEMBRE.LOGIN);
$resultat -> bindParam(':login', $login, PDO::PARAM_STR, 50);
$resultat -> execute();
if($resultat->rowCount() === 1) {
return true;
}
else {
return false;
}
}
// Function de verification du mot de passe
public static function verifPass($pass, $login) {
$resultat = Bdd::connectBdd()->prepare(SELECT.ALL.MEMBRE.LOGIN);
$resultat -> bindParam(':login', $login, PDO::PARAM_STR, 50);
$resultat -> execute();
$donnee = $resultat->fetch(PDO::FETCH_ASSOC);
if(Cryptage::crypter($pass) === $donnee['password']) {
return true;
}
else {
return false;
}
}
// La fonction de gestion des jetons de connexion lors de la connexion d'un membre
// Si il esiste un jeton de connexion appertenant au membre qui se connecte avec la meme adresse ip
// 	-> mise a jour de la date de connexion dans la table des jetons de connexion
//  -> retourne le jeton
// Si il n'existe pas 
// 	-> creation d'un jeton de connexion
// 	-> enregistrement du jeton
//  -> retourne le jeton
public static function jeton($login) {
$id = Membre::recupId($login);
$ip = Ip::get_ip();
$date = time();
$resultat = Bdd::connectBdd()->prepare(SELECT.ALL.JETON.JETONCONNEXION);
$resultat -> bindParam(':id', $id, PDO::PARAM_INT, 11);
$resultat -> bindParam(':ip', $ip);
$resultat -> execute();
if($resultat->rowCount() === 1) {
$donnee = $resultat->fetch(PDO::FETCH_ASSOC);
$id = Membre::recupId($login);
$maj = Bdd::connectBdd()->prepare(UPDATE.JETONZ.JETONDATE.JETONMEMBRE);
$maj -> bindParam(':id', $id);
$maj -> bindParam(':date', $date);
$maj -> execute();
return $donnee['jeton'];
}
else {
$jeton = Cryptage::crypter(Cryptage::chaine(10));
$insert = Bdd::connectBdd()->prepare(INSERT.JETONZ.JETONVALUES);
$insert -> bindParam(':id', $id) ; 
$insert -> bindParam(':jeton', $jeton) ;
$insert -> bindParam(':ip', $ip);
$insert -> bindParam(':date', $date);
$insert -> execute();
return $jeton;
}
}
// Fonction de recuperation du niveau du membre
// 	3 possibilite -> Membre, moderateur, administrateur
//                ****************
// Verification que le membre est actif
// Si actif -> verification du niveau du membre
// Redirection -> Membre, moderateur, administrateur
// Si pas actif
public static function niveau($login) {
$resultat = Bdd::connectBdd()->prepare(SELECT.ALL.MEMBRE.LOGIN);
$resultat -> bindParam(':login', $login, PDO::PARAM_STR, 50);
$resultat -> execute();
$donnee = $resultat->fetch(PDO::FETCH_ASSOC);
if($donnee['activation'] === '1') {
switch($donnee['niveau']) {
case 1 :
$redirect = redirection('membre/index.php');
break;

case 2 :
$redirect = redirection('moderateur/index.php');
break;

case 3 :
$redirect = redirection('administrateur/index.php');
break;
}
}
else {
$activation = Bdd::connectBdd()->prepare(SELEC.ALL.ACTIVATION.METHODEACTIV);
$activation -> execute();
$methode = $activation->fetch(PDO::FETCH_ASSOC);
switch($methode['id']) {
case 1 :
Activation::activationAuto($login);
return Connexion::niveau($login);
break;

case 2 :
$redirect = redirection('activationMail.php');
break;	

case 3 :
$redirect = redirection('activationAdmin.php');
break;	
}
}
return $redirect;
}

} // Fin de la classe de connexion membre

###########################################################################################

// La classe activation
class Activation {

// fonction activation automatique
public static function activationAuto($login) {
$resultat = Bdd::connectBdd()->prepare(INSERT.MEMBRE.ACTIVMEMBRE.LOGIN);
$resultat -> bindParam(':login', $login, PDO::PARAM_STR, 50);
$resultat -> exec(':activer', '1');
}

} // Fin de la classe d'activation

###########################################################################################

// La classe Membre
class Membre {
//Fonction de recuperation de l'id d'un membre
public static function recupId($login) {
$resultat = Bdd::connectBdd()->prepare(SELECT.ALL.MEMBRE.LOGIN);
$resultat -> bindParam(':login', $login, PDO::PARAM_STR, 50);
$resultat -> execute();
$donnee = $resultat->fetch(PDO::FETCH_ASSOC);
return $donnee['id'];
}
// Fonction de recuperation des infos membre
// $id => id du membre
// $info => information qu l'on veux
public static function info($id, $info) {
$resultat = Bdd::connectBdd()->prepare(SELECT.ALL.MEMBRE.ID);
$resultat -> bindParam(':id', $id, PDO::PARAM_INT);
$resultat -> execute();
$infoMembre = $resultat->fetch(PDO::FETCH_ASSOC);
return $infoMembre[$info];
}

} // Fin de la classe Membre

?>



Cordialement,

JéjéScript.

Si on ne réussi pas du premier coup, il faut se rappeler que le grand chêne aussi au début était un gland !

1 réponse

Re,

Le script n'est pas complet car je suis loin d'avoir fini, mais avant de continuer, je préfère être sûr de ce que je fait.

merci à tous.


Cordialement,

JéjéScript.

Si on ne réussi pas du premier coup, il faut se rappeler que le grand chêne aussi au début était un gland !
0
Rejoignez-nous