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 !