IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

[POO] Sécurité sur les requêtes SQL


Sujet :

PHP & Base de données

  1. #1
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut [POO] Sécurité sur les requêtes SQL
    Bonjour,

    Voila pour un projet que je monte, après quelques recherches, j'ai décidé de créer une classe php qui gérerait tout ce qui touche à la base de données.

    Pour cela j'ai utilisé une classe qui étend de la classe MySQLi en php (afin de la customiser)

    Seulement, je cherche maintenant à sécuriser au mieux mes requêtes contre tout ce qui est injection SQL, JavaScript, PHP, HTML, etc etc ...

    Pour l'instant je ne sécurise qu'avec la fonction real_escape_string de la classe MySQLi (que je récupère dans ma classe grâce à l'héritage)

    Voici le code de ma classe (très bref j'avoue, c'est ma première classe php ^_^" )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    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
    <?php
    	/**
    	* Fichier sql.class.php
    	* Classe héritant de la classe php mysqli
    	**********************************************************************************
    	* Création le 23/10/2008
    	* Auteur : Shadow
    	* Dernière modification le 23/10/2008 par Shadow
    	*/
     
    	class sql extends MySQLi
    	{
    		/**
    		* DEFINITION DES VARIABLES INTERNES SUPPPLEMENTAIRES
    		*/
     
     
    		/**
    		* CONSTRUCTEUR
    		* il définit les variables $host, $login, $passwd et $db afin de créer l'objet (celles-i peuvent être modifiées lors de la création de la base)
    		* il utilise le constructeur de la classe MySQLi
    		* 
    		* @param $host
    		* @param $login
    		* @param $passwd
    		* @param $db
    		*/
    		public function __construct($host = '', $login = '', $passwd = '', $db = '')
    		{
    			parent::__construct($host, $login, $passwd, $db);
     
    			$connected = $this->is_connected();	//on vérifie que la connexion a réussie
    		}
     
     
    		/**
    		* RECUPERATION D'UNE REQUETE DYNAMIQUE
    		* la fonction récupère la requête dynamique au format sprintf ainsi que la variable ou le tableau de variables
    		* lors de l'appel de la fonction, on précise si on veut échapper les variables chaines ou pas (0 pour non, 1 pour oui)
    		* 
    		* @param $request
    		* @param $dvars
    		* @param $escape_strings
    		*/
    		public function do_query($request = '', $dvars = array(), $escape_strings = 0)
    		{
    			if (empty($request))	//on regarde si on a une requête ou non
    			{
    				//on affiche une erreur si la requête est vide
    				echo 'Aucune requête à exécuter ...';
     
    				//on renvoie FALSE
    				return FALSE;
    			}
    			else
    			{
    				if (count($dvars) > 0) //on regarde si on a des variables
    				{
    					if ($escape_strings == 1)	//si $escape_strings est à 1 on parcourt le tableau de variables pour les échapper
    					{
    						for ($i = 0; $i < count($dvars); $i++)
    						{
    							$dvars[$i] = $this->real_escape_string($dvars[$i]);
    						}
    					}
     
    					//on crée la requête
    					$query = vsprintf($request, $dvars);
     
    					//on exécute la requête
    					$result = $this->query($query);
    				}
    				else	
    				{
    					//sinon on exécute la requête directement
    					$result = $this->query($request);
    				}
     
    				if ($this->errno)	//on regarde si on a eu une erreur lors de l'exécution de la requête
    				{
    					// on affiche l'erreur
    					echo 'Il y a eu une erreur lors de l\exécution de la requête : '.$this->error;
     
    					//on renvoie false
    					return FALSE;
    				}
    				else
    				{
    					//on retourne le résultat de la requête
    					return $result;
    				}
    			}
    		}
     
     
    		/**
    		* VERIFICATION DE LA CONNEXION
    		* la fonction regarde si il n'y a pas eu d'erreur de connexion (ce qui veut dire que celle-ci a réussie)
    		*/
    		public function is_connected()
    		{
    			if ($this->connect_errno)	//on regarde si il y a une erreur de connexion à la base de données
    			{
    				echo 'Erreur lors de la connexion à la base de données : '.$this->connect_error;	//si il y en a une on afficle l'erreur
    				return FALSE;	//on retourne false
    			}
    			else	//si il n'y a pas d'erreur de connexion on retourne TRUE
    			{
    				return TRUE;
    			}
    		}
    	}
    ?>
    J'aimerai donc savoir comment protéger ma base de données de toutes ces injections (et d'autres problèmes possibles)

    Je cherche évidemment dans mon coin, mais en postant en même temps cela me permettra d'avancer plus vite dans mes recherches grâce à votre aide (et puis cela pourra donc surement servir à d'autres !)

    Je mettrai donc la classe à jour régulièrement selon mes trouvailles (et selon votre aide).

    Merci d'avance pour votre aide !

  2. #2
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut
    Alors j'ai trouvé un petit tuto sur le forum, assez sympatique : ici

    ils y parlent d'un autre tuto sur la sécu, mais je ne l'ai pas encode trouvé, si quelqu'un sait ou il est caché je veux bien l'url ^^

    Merci

  3. #3
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 356
    Points : 15 702
    Points
    15 702
    Par défaut
    tu peux trouver des autres informations sur la sécurité là :
    http://php.developpez.com/cours/?pag...#securite-init
    http://php.developpez.com/faq/?page=securite

  4. #4
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut
    Merci pour les liens

    si vous en avez d'autres n'hésitez pas!

Discussions similaires

  1. [PHP 5.3] conseil sur les requêtes SQL en MVC
    Par grinder59 dans le forum Langage
    Réponses: 24
    Dernier message: 25/08/2014, 20h45
  2. Réponses: 4
    Dernier message: 18/06/2014, 10h01
  3. php POO question sur les class et requetes SQL
    Par craz00 dans le forum Langage
    Réponses: 3
    Dernier message: 28/02/2014, 00h25
  4. [Débutant] Question sur les requêtes SQL
    Par Genyuumaru dans le forum ASP.NET MVC
    Réponses: 4
    Dernier message: 08/10/2012, 08h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo