Précédent   Forum du club des développeurs et IT Pro > PHP > PHP & SGBD > PDO
PDO Forum d'entraide sur PDO (PHP Data Objects) : pilote générique de bases de données avec PHP. Avant de poster -> FAQ PDO et Cours PDO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 16/12/2012, 19h08   #1
JimDraw
Invité régulier
 
Inscription : mars 2012
Messages : 67
Détails du profil
Informations forums :
Inscription : mars 2012
Messages : 67
Points : 7
Points : 7
Par défaut Echapper les caractères potentiellement dangereux pour une requête SQL avec LIKE

Bonsoir à tous,

Sur mon blog, je dispose d'un formulaire de recherche basique (un input de type search) et d'une requête que voici :

Code :
1
2
3
4
$search = htmlspecialchars($_GET['search']);
	if ($search AND $search != "") {
		$req = $bdd->prepare("SELECT * FROM annonce WHERE titre LIKE '%$search%' OR contenu LIKE '%$search%' OR codePostal LIKE '%$search%' ORDER BY date DESC") or die(print_r($bdd->errorInfo()));
		$req->execute(array($search)) or die(print_r($req->errorInfo()));
J'aimerais échapper certains caractères surtout la guillemet simple qui fait planter la requête puisqu'elle comporte .

J'ai testé les caractères suivant : # ! ^ $ ( ) [ ] { } ? + * . \ | tous à la suite je n'ai pas eu de problème...

Je n'ai donc pas trouvé d'autres caractères pouvant causer problème. SI vous en connaissez dites le moi, merci
JimDraw est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2012, 19h41   #2
rawsrc
Modérateur
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 2 602
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 36
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 2 602
Points : 6 149
Points : 6 149
Envoyer un message via Skype™ à rawsrc
Salut,

je t'invite à relire un peu la doc de PDO parce que la manière dont tu l'utilises lui retire absolument tout son intérêt

On utilise des placeholder dans le SQL et pas la valeur de la variable :
Code sql :
1
2
3
4
5
6
7
8
  SELECT * 
    FROM annonce 
   WHERE 
         titre LIKE '%:search%' 
         OR contenu LIKE '%:search%' 
         OR codePostal LIKE '%:search%' 
ORDER BY 
         date DESC
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2012, 19h54   #3
sabotage
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 16 512
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 16 512
Points : 21 349
Points : 21 349
De mémoire, les % ne peuvent être mis dans la requête, il faut les ajouter à la valeur :
Code :
1
2
3
 
$req = $bdd->prepare("SELECT * FROM annonce WHERE titre LIKE :search");
$req->execute(array('%' . $_GET['search'] . '%'))
Sinon rawsrc a raison : tu utilises PDO comme on utilisait l'ancien pilote mysql.
Enlève tes "or die()" ; si tu veux les erreurs, tu as juste à activer les exceptions sur ta connexion.
http://php.net/manual/fr/pdo.error-handling.php
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/12/2012, 19h57   #4
rawsrc
Modérateur
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 2 602
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 36
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 2 602
Points : 6 149
Points : 6 149
Envoyer un message via Skype™ à rawsrc
oui sabotage a raison, tu dois sortir les % de la chaine SQL et les ajouter à la valeur.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2012, 20h16   #5
JimDraw
Invité régulier
 
Inscription : mars 2012
Messages : 67
Détails du profil
Informations forums :
Inscription : mars 2012
Messages : 67
Points : 7
Points : 7
Il n'existe pas des masses de tuto pour PDO donc je l'utilise un peu comme j'ai appris :s

Sabotage : Je ne peux pas juste mettre ":search", si ?

Code :
1
2
$req = $bdd->prepare("SELECT * FROM annonce WHERE titre LIKE :search OR contenu LIKE :search OR codePostal LIKE :search ORDER BY date DESC") or die(print_r($bdd->errorInfo()));
		$req->execute(array('%' . $search . '%')) or die(print_r($req->errorInfo()));
Voici l'erreur que j'ai :

Code :
Array ( Array ( [0] => HY093 [1] => [2] => ) 1
JimDraw est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2012, 20h26   #6
jreaux62
Rédacteur
 
Avatar de jreaux62
 
Homme Jérôme Réaux
Webdesigner
Inscription : août 2008
Messages : 3 657
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Réaux
Âge : 46
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Webdesigner
Secteur : Arts - Culture

Informations forums :
Inscription : août 2008
Messages : 3 657
Points : 7 538
Points : 7 538
Envoyer un message via Skype™ à jreaux62
Bonjour,
voici un bon tuto => Comprendre PDO

Code php :
1
2
3
4
5
6
7
8
9
10
11
$query = "SELECT * 
	FROM annonce 
	WHERE titre LIKE :search 
	OR contenu LIKE :search 
	OR codePostal LIKE :search 
	ORDER BY date DESC";
try {
	$req = $bdd->prepare($query);
	$req->bindValue(':search', '%'.$search.'%', PDO::PARAM_STR);
	$req->execute();
} catch (PDOException $e) { echo 'Erreur SQL : '. $e->getMessage().'<br/>'; die(); }
En supposant d'avoir activé avant la gestion d'erreur PDO.
Code php :
	$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
__________________
"Ce qui se conçoit bien s'énonce clairement - Et les mots pour le dire arrivent aisément."
Nicolas Boileau-Despréaux, Homme de lettres français (1636-1711), principal théoricien de l'esthétique classique.
"Quand le sage montre la lune, le sot regarde le doigt."
Confucius, Homme d'Etat et philosophe chinois (551-479 av. J.-C).
Site perso Mes tutos DVP
Gestion-Affichage de Nouvelles Affichage en tableau HTML Fonctions de redimensionnement d'images
jreaux62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2012, 20h30   #7
JimDraw
Invité régulier
 
Inscription : mars 2012
Messages : 67
Détails du profil
Informations forums :
Inscription : mars 2012
Messages : 67
Points : 7
Points : 7
J'ai testé cette requête pour voir et elle ne fonctionne pas :/
JimDraw est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2012, 20h33   #8
jreaux62
Rédacteur
 
Avatar de jreaux62
 
Homme Jérôme Réaux
Webdesigner
Inscription : août 2008
Messages : 3 657
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Réaux
Âge : 46
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Webdesigner
Secteur : Arts - Culture

Informations forums :
Inscription : août 2008
Messages : 3 657
Points : 7 538
Points : 7 538
Envoyer un message via Skype™ à jreaux62
J'ai mis un lien.
Ce n'est pas une guirlande de Noël, mais ça devrait t'éclairer.
__________________
"Ce qui se conçoit bien s'énonce clairement - Et les mots pour le dire arrivent aisément."
Nicolas Boileau-Despréaux, Homme de lettres français (1636-1711), principal théoricien de l'esthétique classique.
"Quand le sage montre la lune, le sot regarde le doigt."
Confucius, Homme d'Etat et philosophe chinois (551-479 av. J.-C).
Site perso Mes tutos DVP
Gestion-Affichage de Nouvelles Affichage en tableau HTML Fonctions de redimensionnement d'images
jreaux62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2012, 20h36   #9
JimDraw
Invité régulier
 
Inscription : mars 2012
Messages : 67
Détails du profil
Informations forums :
Inscription : mars 2012
Messages : 67
Points : 7
Points : 7
J'y ai jeté un coup d'oeil...n'ayant pas le temps ce soir, je voudrais juste savoir s'il y a moyen d'échapper le caractère ' quitte à ce que je conserve mon "mauvais" code pour ce soir et que je vois comment l'améliorer à l'aide du lien.

Je ne veux pas non plus d'un code tout prêt.
JimDraw est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2012, 20h40   #10
jreaux62
Rédacteur
 
Avatar de jreaux62
 
Homme Jérôme Réaux
Webdesigner
Inscription : août 2008
Messages : 3 657
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Réaux
Âge : 46
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Webdesigner
Secteur : Arts - Culture

Informations forums :
Inscription : août 2008
Messages : 3 657
Points : 7 538
Points : 7 538
Envoyer un message via Skype™ à jreaux62
Citation:
Envoyé par JimDraw Voir le message
...savoir s'il y a moyen d'échapper le caractère '...
Ah, il fallait le dire tout de suite ! => Comprendre PDO
__________________
"Ce qui se conçoit bien s'énonce clairement - Et les mots pour le dire arrivent aisément."
Nicolas Boileau-Despréaux, Homme de lettres français (1636-1711), principal théoricien de l'esthétique classique.
"Quand le sage montre la lune, le sot regarde le doigt."
Confucius, Homme d'Etat et philosophe chinois (551-479 av. J.-C).
Site perso Mes tutos DVP
Gestion-Affichage de Nouvelles Affichage en tableau HTML Fonctions de redimensionnement d'images
jreaux62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2012, 20h43   #11
JimDraw
Invité régulier
 
Inscription : mars 2012
Messages : 67
Détails du profil
Informations forums :
Inscription : mars 2012
Messages : 67
Points : 7
Points : 7
Je ne sais pas si c'est de l'ironie ou si tu n'avais pas compris...en tout cas je l'avais dis dans mon premier post.

Je vais lire le passage du lien, merci beaucoup (pour le moment en retirant le or die... le ' est pris comme caractère et donc plus d'erreur)

Merci encore
JimDraw est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2012, 20h49   #12
jreaux62
Rédacteur
 
Avatar de jreaux62
 
Homme Jérôme Réaux
Webdesigner
Inscription : août 2008
Messages : 3 657
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Réaux
Âge : 46
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Webdesigner
Secteur : Arts - Culture

Informations forums :
Inscription : août 2008
Messages : 3 657
Points : 7 538
Points : 7 538
Envoyer un message via Skype™ à jreaux62
Citation:
Envoyé par JimDraw Voir le message
Je ne sais pas si c'est de l'ironie ...
Bingo ! Humour à froid et café chaud marrons chauds (c'est bientôt Noël !).
__________________
"Ce qui se conçoit bien s'énonce clairement - Et les mots pour le dire arrivent aisément."
Nicolas Boileau-Despréaux, Homme de lettres français (1636-1711), principal théoricien de l'esthétique classique.
"Quand le sage montre la lune, le sot regarde le doigt."
Confucius, Homme d'Etat et philosophe chinois (551-479 av. J.-C).
Site perso Mes tutos DVP
Gestion-Affichage de Nouvelles Affichage en tableau HTML Fonctions de redimensionnement d'images
jreaux62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2012, 20h55   #13
JimDraw
Invité régulier
 
Inscription : mars 2012
Messages : 67
Détails du profil
Informations forums :
Inscription : mars 2012
Messages : 67
Points : 7
Points : 7
Bon je ne le prend pas mal (c'est vrai que de voir défiler des gens toutes la journées qui ne lisent pas les docs...)

J'ai pour le moment régler en supprimant les or die. Puis-je supprimer tous les or die ?

Pour les erreurs j'ajouterai le bout de code qu'il faut après avoir "déclarer" ma BDD en début de code.

Et pour la syntax de PDO je lirai la doc et le tuto.

Merci
JimDraw est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 10h46   #14
JimDraw
Invité régulier
 
Inscription : mars 2012
Messages : 67
Détails du profil
Informations forums :
Inscription : mars 2012
Messages : 67
Points : 7
Points : 7
Je viens de refaire des tests, et si je mets par exemple "l'année", mot se trouvant dans un de mes articles, le script ne me trouve rien...ça doit certainement venir de ma syntaxe, je pense que le ' et " fait sauter la requête, mais est-ce dangereux ou non ?

Merci
JimDraw est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 16h19.


 
 
 
 
Partenaires

Hébergement Web