PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 25-11-2011 02:53:04

rimie
Membre
Inscription : 17-11-2011
Messages : 50

Protection des requetes SQL

Bonjour,

Je fais mes requetes par la methode query, comment puis je proteger mes donnees contre les injections, cote insert, select, update.

$sql = 'INSERT INTO commentaires VALUES (\'\', "'.$level1.'", "'.$level2.'", "'.$level3.'", "'.$num.'", "'.$commentaire.'", "'.$idpseudo.'", "'.$date_posted.'")';
$req = $connexion->query($sql);

merci

Hors ligne

#2 25-11-2011 04:35:36

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Protection des requetes SQL

Bonjour,

En commençant par suivre ces recommendations.

N'hésite pas à demander si t'as pas compris quelque chose.

++


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#3 25-11-2011 05:50:18

rimie
Membre
Inscription : 17-11-2011
Messages : 50

Re : Protection des requetes SQL

Jc a écrit :

Bonjour,

En commençant par suivre ces recommendations.

N'hésite pas à demander si t'as pas compris quelque chose.

++

J'ai mis mon code et je voudrais juste savoir comment le proteger des injections, on sait bien que je dois utiliser les quote, mais je voudrais me donner plus de conseils sur la securite de mes codes smile

Hors ligne

#4 25-11-2011 11:22:20

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Protection des requetes SQL

Bonjour

Alors, dans ces recommendations, si tu les suis à la lettre tu n'as plus de problèmes d'injection possible.

jc a écrit :

Quand vous développez une fonction pour accomplir une tache A à partir d'un paramètre p (ou plusieurs)
1) La fonction ne sait pas ce qu'est p si ce n'est un paramètre : Assurez vous de la bonne valeur du paramètre p avant de le valider et retourner un message d'erreur ou un Numéro d'erreur pour chaque mauvaise valeur de p qui est tentée d'être passée à la fonction.

Une attaque par injection survient quand par exemple en guise de mot de passe on place du code MySQL à la place pour avoir à éviter d'avoir à rentrer le mot de passe. Donc outre le fait de ne jamais passer les variables de saisie directement dans tes requêtes, le meilleur moyen s'est de vérifier ce qu'à saisi l'utilisateur comme dit précedemment.
Et pour cela, le MIEUX c'est de faire un preg_match sur tes variables.

++

Dernière modification par Jc (27-11-2011 20:37:22)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#5 25-11-2011 11:34:44

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Protection des requetes SQL

Saluton,
Autre petite précaution qui ne mange pas de pain, inverser, dans le code SQL, l'ordre des arguments de comparaison :

WHERE '$valeur'=nomdecolonne
// au lieu de
WHERE nomdecolonne='$valeur'

Ceci ne doit pas être considéré comme une alternative à ce que préconise Jc, c'est juste un petit plus.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#6 25-11-2011 15:51:23

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Protection des requetes SQL

Ca ne mange pas de pain en effet l'idée est plus que bonne! Merci MK smile

Dernière modification par Jc (25-11-2011 15:51:57)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#7 26-11-2011 15:42:04

rimie
Membre
Inscription : 17-11-2011
Messages : 50

Re : Protection des requetes SQL

et je peux utiliser aussi quote()?

Hors ligne

#8 26-11-2011 17:15:25

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Protection des requetes SQL

Bonjour,

Oui tu peux, mais cela n'a rien à voir. Moi en général j'utilise addslashes() ou htmlentities() selon le contexte et uniquement pour les champs où je dois accepter que l'utilisateur utilise les simples ou doubles quotes.

++


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#9 27-11-2011 09:57:01

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Protection des requetes SQL

salut
moi, j'utilise PDO wink
a++

Hors ligne

#10 27-11-2011 10:02:23

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Protection des requetes SQL

Lol, tiens, y avait longtemps, et je ne comprends pas pourquoi cela ne m'étonnes pas^^ wink PDO, que j'utilise exclusivement aussi, ne m'évite pas de devoir utiliser addslashes ou htmlentities.^^

Sacré Pierrot big_smile


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#11 27-11-2011 10:02:29

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Protection des requetes SQL

Pierrot a écrit :

salut
moi, j'utilise PDO wink
a++

C'est plus qu'un bon début, Pierrot, mais pour être nécessaire, est-ce suffisant ? (sans vouloir l'être (suffisant))


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#12 27-11-2011 11:07:02

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Protection des requetes SQL

mk->
les sécurités par défauts sont bien au dessus de ce que peu faire un débutant avec mysqli wink
a++

Hors ligne

#13 27-11-2011 16:34:54

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Protection des requetes SQL

Tu prêches un convaincu, Pierrot, je rappelle ici que je lançai, onques, cette croisade.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#14 29-11-2011 04:10:28

rimie
Membre
Inscription : 17-11-2011
Messages : 50

Re : Protection des requetes SQL

est ce qu'on fait ce genre de protection (htmlentities, addslashes,..) meme pour les requete SELECT et DELETE, ou bien juste pour INSERT et UPDATE?

Hors ligne

#15 29-11-2011 10:51:27

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Protection des requetes SQL

Bonjour,

Cela serait bienvenu d'essayer de réfléchir un peu^^, sincèrement. Voici la doc sur la fonction addslashes.
Et voici le contexte que j'ai utilisé

jc a écrit :

Moi en général j'utilise addslashes() ou htmlentities() selon le contexte et uniquement pour les champs où je dois accepter que l'utilisateur utilise les simples ou doubles quotes.

Si pour saisir un nom de famille l'utilisateur s'appele O'Reilly (exemple du lien du manuel PHP et qui correspond au cas où l'utilisateur utilise une simple quote, que ce passe-t-il si l'on n'échappe pas la simple quote??

Regardons cela de plus près donc.


$nom="O'Reilly"; // on est obligé déjà ici de définir la chaîne de caractères entre double quotes car sinon $nom='O'Reilly'; générait un syntax error par le parseur PHP.
$machainedesortie='Avez-vous vu '.$nom.' sortir de la maison?'; // va générer une erreur par le parseur php également car il va y avoir un conflit entre les simples quotes de définition de la chaîne de caractères et la simple quote contenu dans la variable $nom.
 

Donc comme je le disais, cela n'a rien à voir avec des problèmes d'injection^^.

Et selon comment vous définissez/structurez votre code vous pouvez même parfois vous en passer.

ex: Cas où vous autorisez uniquement les simples quotes dans la variable $nom via un preg_match préalable (pas de double donc).
Ecrire


$machainedesortie="Avez-vous vu $nom sortir de la maison?"; // ne générera jamais d'erreur et pas besoin du addslashes ni d'autre chose
 

Cas où vous autorisez uniquement les doubles quotes dans votre variable $nom via un preg_match préalable (pas de simple donc).


$machainedesortie='Avez-vous vu '.$nom.' sortir de la maison?'; // ne générera jamais d'erreur et pas besoin du addslashes ni d'autre chose également, mais on a été obligé d'adapter notre écriture de code par rapport à précedemment.
 

Vous autorisez les simples et doubles quotes dans votre variable. Pas le choix: il faut utiliser une fonction comme addslashes.


$nom="\"Je m'appele O'Reilly\" dit-il "; // les doubles quote de citation ont du être échappés pour pouvoir être inclus dans la variable $nom.
 

J'espère que cela est clair maintenant pour vous.
Par conséquent vous avez la réponse à votre dernière question.

Cordialement,

Jc

Dernière modification par Jc (29-11-2011 11:08:56)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#16 02-12-2011 02:43:34

rimie
Membre
Inscription : 17-11-2011
Messages : 50

Re : Protection des requetes SQL

Merci Jc pour l'explication

Hors ligne

#17 02-12-2011 10:25:54

moogli
Modérateur
Inscription : 08-05-2009
Messages : 336
Site Web

Re : Protection des requetes SQL

yop,

perso je rappelerais la doc de addslashes

Un exemple d'utilisation d'addslashes() est lorsque vous entrez des données dans une base de données. Par exemple, pour insérer le nom O'reilly dans la base, vous aurez besoin de le protéger. Il est fortement recommandé d'utiliser les fonctions de protection spécifiques à chaque base de données (telle que mysqli_real_escape_string() pour MySQL et pg_escape_string() pour PostGreSQL), mais si la base de données que vous utilisez n'a pas de fonction spécifique, et que cette base utilise \ pour protéger les caractères spéciaux, vous pouvez utiliser cette fonction. Grâce à elle, \ sera ajouté. Si la directive PHP magic_quotes_sybase  est activée, ' sera protégé par un autre '.

La directive PHP magic_quotes_gpc  est à on par défaut, et elle appelle addslashes() sur toutes les données GET, POST et COOKIE. N'utilisez pas addslashes() sur des données déjà protégées avec magic_quotes_gpc sinon vous doublerez les protections. La fonction get_magic_quotes_gpc() est utile pour vérifier ce paramètre.

donc avec l'extension mysql(i) mysql(i)_real_escape_string
avec PDO quote() (et pas de requête préparée à tout va svp wink)

pourquoi ?
parce que comme le dit la doc de mysqli_escape_string

Les caractères encodés sont NUL (ASCII 0), \n, \r, \, ', ", and Control-Z.

alors que addslashes dit

Ces caractères sont les guillemets simples ('), guillemets doubles ("), antislash (\) et NUL (le caractère NULL).

Ca fait le même taff en mieux smile

quand au htmlentities, à réserver pour l'affichage, ceci rien que pour garder la possibilité de faire autre chose que du html avec ta base de donnée, par exemple utilise un soft fait dans un autre, java, C, ce que l'on veux pour utiliser en dehors d'un contexte web, ou plus simplement pour un export sur différent support, comme PDF ou n'importe quoi d'autre wink

@+


Il en faut peu pour être heureux pompompompompompompompompompompom

Hors ligne

Pied de page des forums