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 06/12/2010, 23h20   #1
Membre habitué
 
Inscription : décembre 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 21
Points : 114
Points : 114
Par défaut Insertion SQL

Bonsoir à tous,

je vous explique mon problème: je dois créer une application web pour gérer des stages pour une association. L'architecture html est faite, il me reste 'simplement' à ajouter du code php là-dessus.
J'y arrive à peu près, qu'il s'agisse d'interroger la base ou de modifier certains champs.
On m'a dit qu'il fallait _absolument_ protéger les champs texte des insertions SQL. Je ne vois pas tellement qui serait intéressé par ma base de données, mais sur de l'expérience des internautes, je vous fais confiance.
C'est à ce moment que ça coince: je peux modifier/interroger la base sans problème si les champs ne contiennent que du texte, mais si j'ajoute le caractère " (double quote), la saisie saute! Ceci, sans faire appel à une fonction de protection SQL. Ce qui m'ennuie, c'est que les utilisateurs doivent pouvoir utiliser les double quotes et autres caractères exotiques dans leur saisie (il n'est pas imaginable de leur dire qu'ils ne peuvent pas utiliser tel ou tel caractère).

Voici un bout du code:
- la récupération des infos saisies sur la page précédente:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
$id_poste=$_POST["id_poste"]; //l'identifiant du stage choisi
$structure = ucwords($_POST['structure']); // variable 'structure'
$departement = ucwords($_POST['departement']); // variable 'departement'
$pole = $_POST['pole']; // variable 'pole'
$adresse_structure = $_POST['adresse_structure']; // var 'adresse_structure'
$cp_structure = $_POST['cp_structure']; // variable 'cp_structure'
$ville_structure = ucwords($_POST['ville_structure']); // var 'ville_structure'
$resp_prenom = ucwords($_POST['resp_prenom']); // variable 'resp_prenom'
$resp_nom = ucwords($_POST['resp_nom']); // variable 'resp_nom'
$resp_mail = $_POST['resp_mail']; // 'resp_mail'
$resp_tel = $_POST['resp_tel']; // 'resp_tel'
- et enfin la requête:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
$query_update_poste = sprintf(
"UPDATE base.stages 
SET structure = '$structure', 
departement = '$departement', 
pole = '$pole', 
adresse_structure = '$adresse_structure', 
cp_structure = '$cp_structure', 
ville_structure = '$ville_structure', 
resp_prenom = '$resp_prenom', 
resp_nom = '$resp_nom', 
resp_mail = '$resp_mail', 
resp_tel = '$resp_tel' 
WHERE id_poste = '$id_poste'");
Il s'agit sûrement d'une erreur de débutant, j'ai cherché pendant plusieurs heures une réponse sur google, sans trouver. Y compris en utilisant la fonction suivante, glanée sur le site php.net:
Code :
1
2
3
4
5
6
7
8
 
function quote_smart($value)
	{
		if(get_magic_quotes_gpc()) {
			$value = stripslashes($value);
		}
		return addslashes($value);
	}
Merci infiniment de votre aide!!

T.
tarlito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 23h51   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
L’échappement des chaînes de caractères sert effectivement a empêcher les injections sql mais aussi a échapper les guillemets normaux de la chaîne.

avec l'extension mysql_ on utilise la fonction mysql_real_escape_string()
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2010, 10h33   #3
Membre habitué
 
Inscription : décembre 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 21
Points : 114
Points : 114
Citation:
Envoyé par sabotage Voir le message
L’échappement des chaînes de caractères sert effectivement a empêcher les injections sql mais aussi a échapper les guillemets normaux de la chaîne.

avec l'extension mysql_ on utilise la fonction mysql_real_escape_string()
Merci de ta réponse.
Cependant j'avais essayé d'utiliser la fonction mysql_real_escape_string(), qui n'a pas résolu mon problème: si $departement vaut : Unité "bidule", le texte bidule disparaît avec les double quotes...
tarlito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2010, 11h28   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
Citation:
Envoyé par tarlito Voir le message
Merci de ta réponse.
Cependant j'avais essayé d'utiliser la fonction mysql_real_escape_string(), qui n'a pas résolu mon problème: si $departement vaut : Unité "bidule", le texte bidule disparaît avec les double quotes...
normale non ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2010, 11h56   #5
Membre habitué
 
Inscription : décembre 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 21
Points : 114
Points : 114
Citation:
Envoyé par stealth35 Voir le message
normale non ?
Ben justement, il me semble que oui, mais je voudrais pouvoir les garder - ou les remplacer - pour que rien de la saisie ne saute (sans toutefois risquer une insertion malintentionnée). Et que si un utilisateur précise qu'il s'agit du département "Bidule", l'interrogation de la base (dans une autre page) me précise qu'il s'agit bien du département "Bidule". Sachant que les doubles quote m'importent peu.
Peut-être que ce n'est pas possible?
Je suis plutôt sur le versant débutant, alors je rame un peu...
tarlito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2010, 14h23   #6
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Est-ce que c'est bien a l'insertion que le texte est tronqué ?

Si tu essaies d'inserer une chaine avec les mauvais guillemets, ta requete ne fonctionnera pas, donc rien ne sera insérer ; il faut utiliser une fonction comme myslq_real_escape_string().

Si tu essaies d'afficher une chaine avec les mauvais guillemets dans un input, le texte sera tronqué au guillemet fautif ; il faut utiliser une fonction comme htmlentities.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2010, 14h50   #7
Membre éprouvé
 
Avatar de radicaldreamer
 
Homme Guillaume
Développeur Web
Inscription : décembre 2007
Messages : 353
Détails du profil
Informations personnelles :
Nom : Homme Guillaume
Âge : 21
Localisation : France, Haut Rhin (Alsace)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : décembre 2007
Messages : 353
Points : 473
Points : 473
Utilisons les bons termes... On t'as demandé d'éviter "l'injection" SQL (et non l'insertion). (juste pour petite correction ^^)

Je pense que le plus simple à faire est de passer toute ta chaine ($_POST['text_utilisateur']) dans htmlentities (qui convertira tous les caractères spéciaux en caractères HTMl)
__________________
Si ce que tu as à dire n'est pas plus beau que le silence, alors tais toi.

- Pensez à voter pour les messages qui vous ont été utiles ainsi que de mettre
radicaldreamer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2010, 17h04   #8
Membre habitué
 
Inscription : décembre 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 21
Points : 114
Points : 114
Citation:
Envoyé par sabotage Voir le message
Est-ce que c'est bien a l'insertion que le texte est tronqué ?
Merci! En effet je n'ai pas vérifié cela. Je regarde ça ce soir et je te donne des nouvelles.

Citation:
Envoyé par radicaldreamer Voir le message
Utilisons les bons termes... On t'as demandé d'éviter "l'injection" SQL (et non l'insertion). (juste pour petite correction ^^)
Oui, c'est vrai. Je rame donc plus que je ne le pensai!
Citation:
Envoyé par radicaldreamer Voir le message
Je pense que le plus simple à faire est de passer toute ta chaine ($_POST['text_utilisateur']) dans htmlentities (qui convertira tous les caractères spéciaux en caractères HTMl)
Cela dès le script d'insertion dans la base, ou simplement à l'affichage?
Je vérifie la base après l'insertion et je vous dit ce qui se passe avec l'utilisation des deux fonctions que vous m'avez proposées.
Merci en tout cas pour les tuyaux!
tarlito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2010, 18h42   #9
Membre éprouvé
 
Avatar de radicaldreamer
 
Homme Guillaume
Développeur Web
Inscription : décembre 2007
Messages : 353
Détails du profil
Informations personnelles :
Nom : Homme Guillaume
Âge : 21
Localisation : France, Haut Rhin (Alsace)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : décembre 2007
Messages : 353
Points : 473
Points : 473
lors de l'ajout du texte dans la base de données:

Code :
1
2
 
mysql_query('INSERT INTO table VALUES('.htmlentities($_POST['texte']).')');
Et lors de la récupération des données pour l'affichage:

Code :
1
2
 
echo html_entity_decode($var['texte']);
__________________
Si ce que tu as à dire n'est pas plus beau que le silence, alors tais toi.

- Pensez à voter pour les messages qui vous ont été utiles ainsi que de mettre
radicaldreamer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2010, 19h28   #10
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Ca serait absurde de mettre des entités HTML dans la base de donnée et de les retirer quand on est dans la page HTML.

La bonne méthode est :

Code :
mysql_query('INSERT INTO table VALUES("'.mysql_real_escape_string($_POST['texte']).'")');
Code :
echo htmlspecialchars($var['texte']);
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2010, 21h27   #11
Membre habitué
 
Inscription : décembre 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 21
Points : 114
Points : 114
Bon alors j'ai essayé plusieurs techniques...
Une seule fonctionne: addslashes()

En gros, je modifie le code comme ça:
Code :
1
2
 
$resp_prenom = addslashes(ucwords($_POST['resp_prenom']));
ça fonctionne. La base est bien modifiée, et si resp_prenom = 'toto', alors dans la base figure 'toto' (que je peux afficher tel quel).
Par contre, si je mets "toto" la valeur est vide. Les autres modifications de la base sont cependant enregistrées.
Si je change pour mysql_real_escape_string(ucwords($_POST['resp_prenom']),$Connexion);, avec 'toto' tout fonctionne mais il ne prend pas les double quote , comme avec addslashes.

J'en conclus qu'il y a un problème avec les double quote, non?
Seul problème, je n'arrive pas à les remplacer avec str_replace() ...
Pouvez-vous m'expliquer?
tarlito est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h04.


 
 
 
 
Partenaires

Hébergement Web