Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/08/2011, 19h18   #1
Invité régulier
 
Inscription : novembre 2010
Messages : 59
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 59
Points : 8
Points : 8
Par défaut Sécurité contre failles XSS et injections SQL et optimisation du formulaire

Bonjour à tous,

Je souhaiterais sécuriser mon code de manière efficace en le protégeant contre les failles XSS et les injections SQL mais je ne sais pas trop comment m'y prendre. Disons j'aimerais savoir quel est le moyen le plus abouti pour protéger au mieux mon code.
De plus je voulais savoir comment optimiser mon code car beaucoup de choses se répètent sous une forme assez semblable (comme par exemple les fonctions de vérification des champs du formulaire dans le fichier traitement.php).
Enfin je souhaiterais que soit le formulaire s'affiche pour y rentrer les données à saisir soit il ne soit plus visible et que seuls les messages d'échec (champs à corriger) ou de succès (envoi à la bdd) s'affichent.


Voici le fichier formulaire.php

Code :
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
 
 
<?php include 'traitement.php'; ?>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Formulaire</title>
</head>
<body>
 
<form method="post" action="formulaire.php">
 
	<fieldset style="margin:50px">
	<legend><b>Vos coordonn&eacute;es</b></legend>
	<table>
		<tr>
			<td width="220"><label for="nom">Nom :</label></td>
			<td><input type="text" name="nom" value=""/></td>
		</tr>
 
		<tr>
			<td width="220"><label for="prenom">Pr&eacute;nom :</label></td>
			<td><input type="text" name="prenom" value =""/></td>
		</tr>
 
		<tr>
			<td width="220"><label for="adresse">Adresse :</label></td>
			<td><input type="text" name="adresse" value =""/></td>
		</tr>
 
		<tr>
			<td width="220"><label for="code_postal">Code postal :</label></td>
			<td><input type="text" name="code_postal" value=""/></td>
		</tr>
 
		<tr>
			<td width="220"><label for="ville">Ville :</label></td>
			<td><input type="text" name="ville" value=""/></td>
		</tr>
 
		<tr>
			<td width="220"><label for="telephone">T&eacute;l&eacute;phone :</label></td>
			<td><input type="text" name="telephone" value=""/></td>
		</tr>
 
		<tr>
			<td width="220"><label for="fax">Fax :</label></td>
			<td><input type="text" name="fax" value=""/></td>
		</tr>
 
		<tr>
			<td width="220"><label for="email">Email :</label></td>
			<td><input type="text" name="email" value=""/></td>
		</tr>
 
	</table>
	</fieldset>
 
	<fieldset style="margin:50px">
	<legend><b>Vos informations</b></legend>
	<table>
 
		<tr>
			<td width="270"><label for="client">Souhaitez vous une demande de contact ?</label></td>
			<td>
			<input type="radio" name="client" id="client_oui" value="1"/> <label for="client_oui">Oui</label>
			<input type="radio" name="client" id="client_non" value="0"/> <label for="client_non">Non</label>
			</td>
		</tr>
 
			<tr>
			<td width="250"><label for="site[]">Comment avez vous connu le site ?</label></td>
			<td>
 
			<?php while($aData = mysql_fetch_assoc($qSite)){ ?>
				<input type="checkbox" name="site[]" value="<?php echo $aData['id']; ?>" /> <label><?php echo $aData['n_site']; ?></label>
			<?php } ?>
 
			</td>
		</tr>
 
		<tr>
			<td width="270"><label for="demande[]">Quelles sont vos demandes de site ?</label></td>
			<td>
 
			<?php while($aData = mysql_fetch_assoc($qDemande)){ ?>
				<input type="checkbox" name="demande[]" value="<?php echo $aData['id']; ?>" /> <label><?php echo $aData['n_demande']; ?></label>
			<?php } ?>
 
			</td>
		</tr>
 
	</table>
	</fieldset>
 
	<fieldset style="margin:50px">
	<legend><b>Vos options</b></legend>
	<table>
 
		<tr>
			<td width="220"><label for="devis">Demande de devis :</label></td>
			<td>
			<input type="radio" name="devis" id="devis_oui" value="1"/> <label for="devis_oui">Oui</label>
			<input type="radio" name="devis" id="devis_non" value="0"/> <label for="devis_non">Non</label>
			</td>
		</tr>
 
		<tr>
			<td width="220"><label for="contact">Demande de contact :</label></td>
			<td>
			<input type="radio" name="contact" id="contact_oui" value="1"/> <label for="contact_oui">Oui</label>
			<input type="radio" name="contact" id="contact_non" value="0"/> <label for="contact_non">Non</label>
			</td>
		</tr>
 
	</table>
	</fieldset>
 
	<fieldset style="margin:50px">
	<legend><b>Op&eacute;rations</b></legend>
	<table>
		<tr>
			<td width="250"><label for="valider"></label></td>
			<td><input type="submit" value="Valider" name="valider"/></td>
			<td><input type="reset" value="Effacer"></td>
		</tr>
	</table>
	</fieldset>
 
</form>
 
 
</body>
</html>
Et voici le fichier traitement.php

Code :
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
 
 
<?php 
 
include ("configuration.php");// connexion à la base de données
 
//------------------------------------------------------
		//Déclaration des variables à poster dans le formulaire
 
		$id=$_POST['id'];
 
		$nom=$_POST['nom'];
			if(isset($nom)){htmlentities($nom, ENT_QUOTES);}
			$nom = mysql_escape_string(htmlspecialchars($nom));  
 
		$prenom=$_POST['prenom'];
			if(isset($prenom)){htmlentities($prenom, ENT_QUOTES);}
			$prenom = mysql_escape_string(htmlspecialchars($prenom));  
 
		$adresse=$_POST['adresse'];
			if(isset($adresse)){htmlentities($adresse, ENT_QUOTES);}
			$adresse = mysql_escape_string(htmlspecialchars($adresse));  
 
		$code_postal=$_POST['code_postal'];
			if(isset($code_postal)){htmlentities($code_postal, ENT_QUOTES);}
			$code_postal = mysql_escape_string(htmlspecialchars($code_postal));  
 
		$ville=$_POST['ville'];
			if(isset($ville)){htmlentities($ville, ENT_QUOTES);}
			$ville = mysql_escape_string(htmlspecialchars($ville));  
 
		$telephone=$_POST['telephone'];
			if(isset($telephone)){htmlentities($telephone, ENT_QUOTES);}
			$telephone = mysql_escape_string(htmlspecialchars($telephone));  
 
		$fax=$_POST['fax'];
			if(isset($fax)){htmlentities($fax, ENT_QUOTES);}
			$fax = mysql_escape_string(htmlspecialchars($fax));  
 
		$email=$_POST['email'];
			if(isset($email)){htmlentities($email, ENT_QUOTES);}
			$email = mysql_escape_string(htmlspecialchars($email));  
 
		$client=$_POST['client'];
			if(isset($client)){htmlentities($client, ENT_QUOTES);}
			$client = mysql_escape_string(htmlspecialchars($client));  
 
		$aSite=$_POST['site'];
		$aDemande=$_POST['demande'];
 
		$devis=$_POST['devis'];
			if(isset($devis)){htmlentities($devis, ENT_QUOTES);}
			$devis = mysql_escape_string(htmlspecialchars($devis));  
 
		$contact=$_POST['contact'];
			if(isset($contact)){htmlentities($contact, ENT_QUOTES);}
			$contact = mysql_escape_string(htmlspecialchars($contact));  
 
//------------------------------------------------------
		//Fonctions de vérification des champs
 
		function VerifierCodePostal($code_postal) 
			{ 
				$SyntaxeCodePostal='`[0-9]{5}`';
				if(preg_match($SyntaxeCodePostal,$code_postal))
			  	   return true; 
			   else 
			       return false; 
			}
 
 
		function VerifierTelephone($telephone) 
			{ 
				$SyntaxeTelephone='`[0-9]{10}`';
				if(preg_match($SyntaxeTelephone,$telephone))
			  	   return true; 
			   else 
			       return false; 
			}
 
 
		function VerifierFax($fax) 
			{ 
				$SyntaxeFax='`[0-9]{10}`';
				if(preg_match($SyntaxeFax,$fax))
			  	   return true; 
			   else 
			       return false; 
			}
 
 
		function VerifierMail($email) 
			{ 
			   $SyntaxeMail='#^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,6}$#'; 
			   if(preg_match($SyntaxeMail,$email)) 
			      return true; 
			   else 
			      return false; 
			}
 
//-----------------------------------------------------------
			// Traitement des données du formulaire
 
	/**
     * 
     * Si formulaire posté Alors
     * 		Si données valide Alors
     * 			enregistrer en base de donnée et dire que ça martche uniquement le message, le formulaire doit disparaitre ! 
     * 		Sinon
     * 			Afficher le formulaire avec les valeurs que l'utilisateurs a inscrites + message que tous les champs ne sont pas valides
     * 		Fin Si
     * Fin Si
     * 
     */
 
			if(isset($_POST['valider'])){
 
			if (isset($nom) && isset($prenom) && isset($adresse) && (VerifierCodePostal($code_postal) == true) && isset($ville) && (VerifierTelephone($telephone) == true) 
			&& (VerifierFax($fax) == true) && (VerifierMail($email) == true) && isset($client) && isset($aSite) && isset($aDemande) && isset($devis) && isset($contact)){
 
				$etat='envoi'; // envoi des données à la bdd avec message de validation
			}
			else{ // tous les champs n'ont pas été remplis donc on affiche un message pour chaque champs du formulaire à ressaisir
 
      // VOS COORDONNEES
 
			if (empty($nom)) {
				echo 'Veuillez saisir votre nom!'."</br>";
			}
			if (empty($prenom)) {
				echo 'Veuillez saisir votre prénom!'."</br>";
			}
			if (empty($adresse)) {
				echo 'Veuillez saisir votre adresse!'."</br>";
			}
 
			//code postal
 
			if (empty($code_postal)) {
				echo 'Veuillez saisir votre code postal!'."</br>";
			}
			else{
				if (VerifierCodePostal($code_postal)==false) 
				  	echo 'Votre code postal n\'est pas valide. Veuillez le resaisir '."</br>";
			}
 
			//ville
 
			if (empty($ville)) {
				echo 'Veuillez saisir votre ville!'."</br>";
			}
 
			//telephone
 
			if (empty($telephone)) {
				echo 'Veuillez saisir votre numéro de telephone!'."</br>";
			}
			else{
				if (VerifierTelephone($telephone)==false)
				  	echo 'Votre numéro de téléphone n\'est pas valide. Veuillez le resaisir '."</br>";
			}
 
			//fax
 
			if (empty($fax)) {
				echo 'Veuillez saisir votre fax!'."</br>";
			}
			else{
				if (VerifierFax($fax)==false)
				  	echo 'Votre numéro de fax n\'est pas valide. Veuillez le resaisir '."</br>";
			}
 
			//email
 
			if (empty($email)) {
				echo 'Veuillez saisir votre email!'."</br>";
			}
			else{
				if (VerifierMail($email)==false) 
				  	echo 'Votre email n\'est pas valide. Veuillez le resaisir '."</br>";
			}
 
	    // VOS INFORMATIONS
 
			//client
 
			if (empty($client)) {
				echo 'Veuillez préciser si vous êtes client de l\'entreprise!'."</br>";
			}
 
			//site
 
			if (empty($aSite)) {
				echo 'Veuillez préciser comment vous avez connu le site!'."</br>";
			}
 
			//demande
 
			if (empty($aDemande)) {
				echo 'Veuillez préciser votre demande de site!'."</br>";
			}
 
	  //VOS OPTIONS
 
    		//devis
 
			if (empty($devis)) {
				echo 'Veuillez préciser votre demande de devis!'."</br>";
			}
 
			//contact	
 
			if (empty($contact)) {
				echo 'Veuillez préciser votre demande de contact!'."</br>";
			}
		}
	}
 
//----------------------------------------------------------------------------
			// Gestion affichage des checkbox site et demande dans formulaire et dans bdd
 
				//site
 
	    	$sSQL = "SELECT n_site FROM site ORDER BY n_site" ;
			$qSite = mysql_query($sSQL);
 
 
			$sSQLSite = "SELECT * FROM site ORDER BY n_site";
			$qSite = mysql_query($sSQLSite);
 
 
				//demande
 
    		$sSQL = "SELECT n_demande FROM demande ORDER BY n_demande" ;
			$qDemande = mysql_query($sSQL);
 
			$sSQLDemande = "SELECT * FROM demande ORDER BY n_demande";
			$qDemande = mysql_query($sSQLDemande);
 
//----------------------------------------------------------------------------
			// Cas état envoi
	if($etat=='envoi'){ // si toutes les données sont remplies et valides, envoi des données dans la bdd 
 
 
		    $sql = "INSERT INTO formulaire(id, nom, prenom, adresse, code_postal, ville, telephone, fax, email, devis, contact) 
	    	VALUES('','$nom','$prenom','$adresse','$code_postal','$ville','$telephone','$fax','$email', '$devis', '$contact')";
 
	   		mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
 
		  	$id_formulaire = mysql_insert_id();// on récupère l'id_formulaire qui vient d'être généré
 
 
		if(isset($aSite)){
			foreach($aSite as $n_site){
 
	        $sql = "INSERT INTO siteformulaire(id_formulaire, id_site) VALUES ('$id_formulaire','$n_site')";
	        mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
				}
			}
 
 
		if(isset($aDemande)){
			foreach($aDemande as $n_demande){
 
			$sql = "INSERT INTO demandeformulaire(id_formulaire, id_demande) VALUES ('$id_formulaire','$n_demande')";
	        mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
				}
			}
 
	    	echo "les données sont enregistrées dans la base de données";
			}
 
?>
N'hésitez pas à me poser des questions sur mon code car je ne prétend pas avoir utilisé forcément les meilleures méthodes.

Merci
kenjiendo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2011, 11h00   #2
Nouveau Membre du Club
 
Homme Tarek
Technicien Help Desk
Inscription : juillet 2011
Messages : 32
Détails du profil
Informations personnelles :
Nom : Homme Tarek
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Technicien Help Desk
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : juillet 2011
Messages : 32
Points : 35
Points : 35
Envoyer un message via Yahoo à mctarek
Citation:
Envoyé par kenjiendo Voir le message
Bonjour à tous,

Je souhaiterais sécuriser mon code de manière efficace en le protégeant contre les failles XSS et les injections SQL mais je ne sais pas trop comment m'y prendre. Disons j'aimerais savoir quel est le moyen le plus abouti pour protéger au mieux mon code.
De plus je voulais savoir comment optimiser mon code car beaucoup de choses se répètent sous une forme assez semblable (comme par exemple les fonctions de vérification des champs du formulaire dans le fichier traitement.php).
Enfin je souhaiterais que soit le formulaire s'affiche pour y rentrer les données à saisir soit il ne soit plus visible et que seuls les messages d'échec (champs à corriger) ou de succès (envoi à la bdd) s'affichent.


Voici le fichier formulaire.php

N'hésitez pas à me poser des questions sur mon code car je ne prétend pas avoir utilisé forcément les meilleures méthodes.

Merci
Bonjour. Voici mes humbles remarques :
- Grouper les codes de vérification dans un fichier à part puis l'inclure à traitement.php. Cela sera utile à d'autres de vos scripts.
- mysql_escape_string est OBSOLETE depuis PHP 5.3.0. Mieux vaut utiliser mysql_real_escape_string()
- Dans le code, je lis (== true), j'aurai écrit (=== true)
- nettoyer les données utilisateur avec trim()
- isset($var) vérifie si la variable a été initialisé et n'est pas null. Mais que faire si elle est vide? J'ai habitude d'associer isset et empty; par ex: if (isset ($nom) && !empty($nom)) {// instructions; } mais ça allonge le code.

mctarek
mctarek est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/08/2011, 11h35   #3
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 011
Points : 5 011
Plus simple en utilisant les filtres:
- http://php.net/manual/en/function.filter-input.php
- http://www.php.net/manual/en/filter....s.sanitize.php
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h02.


 
 
 
 
Partenaires

Hébergement Web