Rechercher : dans
Par :

Protection requete SQL

Dernière réponse le 2 jun 2009 à 14:39:13 okuni, le 2 jun 2009 à 12:06:07 
 Signaler ce message aux modérateurs

Bonjour,

J'aimerais savoir quel est la meilleur protection que l'on peut mettre sur une requete sql et les données qu'on enregistre vie un INSERT.

Je connais plusieur fonction mais je ne sais pas la quel est la meilleur.
Il y a
addslash()
htmlentities()
htmlspecialchars()
mysql_escape_string()
mysql_escape_real_string()

Il y a peut-être des faute d'orthographe car je les écrit de mémoire.

Quel est ou quel sont les meilleur fonctions pour éviter les erreur sql du entre autre au ' et " ?

Merci de vos réponses. L'amour, c'est comme les spaghettis; quand c'est mou, c'est cuit. (proverbe belge)

Meilleures réponses pour « protection requete SQL » dans :
SQL - éviter les doublons dans un SELECT VoirProblème Comment éviter les doublons dans les résultats d'une requête SQL ? Solution Il suffit d'utiliser la clause DISTINCT entre SELECT et les champs. Exemple : SELECT distinct id,nom,prenom FROM matable Plus d'informations ...
Exécution de requêtes avec JDBC VoirExécution d'une requête SQL Pour exécuter une requête SQL, il s'agit dans un premier temps de créer un objet Statement, pouvant être obtenu à partir de l'objet Connection. Un objet ResultSet permettra de récupérer les données en provenance de...

1

hanagi, le 2 jun 2009 à 12:12:16

Salut OKUNI, dsl j'ai pas de réponse pour toi mais j'ai plutot une question ,)
Je trouve ce sujet interessant mais j'ai pas compris "protection que l'on peut mettre sur une requete sql et les données qu'on enregistre vie un INSERT". Est ce qu'on protége ces requete? et de quoi les proteger?
voudrais-tu m'éclairer stp ? (curiosité :p)

Répondre à hanagi

2

okuni, le 2 jun 2009 à 12:15:17

Tout simplement pour éviter :
1) le hackage (ça se dit? :p) de ton site (ou plutot de ta base de donnée)
2) pour éviter les failles et erreur a cause des ' ou ".

Donc j'espère diminuer mes failles sql avec de bonnes fonctions. L'amour, c'est comme les spaghettis; quand c'est mou, c'est cuit. (proverbe belge)

Répondre à okuni

3

Dr Zoidberg, le 2 jun 2009 à 12:17:24

Salut,

On utilise plutôt mysql_real_excape_string
http://fr2.php.net/manual/fr/function.mysql-real-escape-stri­ng.php
Car elle prend en compte le jeu de caractère de la connexion actuelle.

Répondre à Dr Zoidberg

4

ben85350, le 2 jun 2009 à 12:18:11

Il y de nombreuses failles possibles quand on utilise pas de fonctions particulières.
Exemple : les injections SQL : http://fr.wikipedia.org/wiki/Injection_SQL

Répondre à ben85350

5

okuni, le 2 jun 2009 à 12:23:03

Simplement utiliser mysql_real_excape_string ?
cette fonction protège aussi contre les balise html et JS? L'amour, c'est comme les spaghettis; quand c'est mou, c'est ­cuit. (proverbe belge)

Répondre à okuni

6

hanagi, le 2 jun 2009 à 12:43:24

Oh! ça c bon OKUNI ;) , mais je le savais pa :p
Pouvez vous me montrer comment on utilise ces fonctions? (syntaxe)
par exemple pour :mysql_real_excape_string
J'en ai aucune idée :s . Besoin de votre aide
Merci d'avance .

Répondre à hanagi

8

pyschopathe, le 2 jun 2009 à 12:53:01

Pour rappel, il faut protéger toutes les données provenant de l'utilisateur afin d'éviter les injections SQL ou la perte de cohérence des données. Une petite recherche sur google en apprendra plus à ceux qui le souhaitent.

Une fonction ne suffit pas à assurer la sécurité de tes requêtes : les fonctions que tu présentes ne servent qu'à protéger les chaines de caractères, mais il faut aussi penser à vérifier que lorsque des valeurs numériques sont attendues, on insère bien des valeurs numériques, et idem pour les autres champs.

Si tu as une base de données mysql, utilise la fonction mysql_real_escape_string pour tes chaînes de caractères, sinon utilise htmlspecialchars.

Pour les valeurs numériques, tu peux utiliser is_numeric, pour les dates, les email, les numéros de téléphone, des expressions régulières seront toutes indiquées.

Tu les appelles en leur passant la chaine à protéger en paramètre :

INSERT INTO table( 'login' ) VALUES mysql_real_escape_string( $POST['login'] );

Répondre à pyschopathe

7

Dr Zoidberg, le 2 jun 2009 à 12:50:14

Non elle mysql_real_escape_string ne protège pas des balises HTML, tu parlais de protection SQL pas de protection HTML.

On utilise toujours mysql_real_escape_string avant une insertion (ou update) dans la base afin de ne pas perturber le bon fonctionnement de la commande (effectivement pour les ' " \n et qq autres). Mais rien n'interdit d'y inserer des balises HTML (heureusement :-) )

Mais la protection du HTML c'est autre chose, par exemple au moment de traiter une donnée saisie par l'utilisateur on va vouloir filtrer les balises HTML, on va alors utiliser htmlentities.

Répondre à Dr Zoidberg

9

okuni, le 2 jun 2009 à 13:26:28

Ok merci :)
quel est la différence entre htmlentities et htmlspecialchars ? L'amour, c'est comme les spaghettis; quand c'est mou, c'est ­cuit. (proverbe belge)

Répondre à okuni

10

pyschopathe, le 2 jun 2009 à 13:29:29

Htmlentities remplace tous les caractères ayant un équivalent en HTML par cet équivalent (& pour '&', > pour '>', etc), ce qui peut être utile dans certains cas, mais n'apporte pas de protection supplémentaire. Tourne toi vers la documentation php pour plus d'infos.

Répondre à pyschopathe

12

Dr Zoidberg, le 2 jun 2009 à 13:35:11

Pour moi c'est une protection indispensable (dans le cas d'affichage de données saisies par un utilisateur, blog, wiki ... ) ca évite des injections de code HTML (Cross-Site Scripting) en supprimant les interprétations des balises html notamment script, object, applet et embed

Répondre à Dr Zoidberg

14

pyschopathe, le 2 jun 2009 à 14:16:10

Tout à fait d'accord, mais ce n'est pas une protection contre les injections SQL. Il est aussi possible d'effectuer le remplacement des caractères à l'affichage par exemple, en fonction de moyen d'affichage (ce n'est pas forcément du HTML). Mais effectivement, si l'application contient des données visibles uniquement en HTML, il est préférable de les stocker directement encodés, ça évite de refaire le traitement à chaque affichage.

Répondre à pyschopathe

11

Dr Zoidberg, le 2 jun 2009 à 13:30:27

Htmlspecialchar ne remplace que ' " & < >, htmlentities remplace tout ce qui a un équivalent en html ( caractères accentués ... )


http://fr2.php.net/manual/fr/function.htmlspecialchars.php
http://fr2.php.net/manual/fr/function.htmlentities.php

Répondre à Dr Zoidberg

13

okuni, le 2 jun 2009 à 13:44:45

J'ai regardé le manul php
si je comprend bien, si on utilise htmlentities(), on devra alors chaque fois qu'on affiche une donnée qui a été trensformé, utiliser html_entity_decode() pour enlever les transformations ? L'amour, c'est comme les spaghettis; quand c'est mou, c'est ­cuit. (proverbe belge)

Répondre à okuni

15

pyschopathe, le 2 jun 2009 à 14:17:30

Pas si tu affiches les données en HTML : dans ce cas, c'est le navigateur qui interprêtera les entités HTML et les affichera correctement : s'il lit é, il affichera é, etc.

Répondre à pyschopathe

16

okuni, le 2 jun 2009 à 14:22:43

Ok merci.
Quant tu dis "si tu affiches les données en HTML"
Il y a moyen de les afficher autrement? L'amour, c'est comme les spaghettis; quand c'est mou, c'est cuit. (proverbe belge)

Répondre à okuni

18

pyschopathe, le 2 jun 2009 à 14:30:30

Bah avec PHP tu pourrais vouloir afficher du texte dans une image avec la librairie GD, créer un simple fichier texte, du XML, écrire un PDF, etc. Donc oui, il y a moyen de faire autre chose, il y a même plein de moyens !

Répondre à pyschopathe

19

okuni, le 2 jun 2009 à 14:31:49

Ok merci :) L'amour, c'est comme les spaghettis; quand c'est mou, c'est ­cuit. (proverbe belge)

Répondre à okuni

20

 pyschopathe, le 2 jun 2009 à 14:39:13

De rien ! Pour mes posts précédent, ccm a converti les caractères HTML donc il fallait lire : "s'il lit &eacute;, il affichera é".

Répondre à pyschopathe

17

Dalida, le 2 jun 2009 à 14:30:19

Salut,

Quel est ou quel sont les meilleur fonctions pour éviter les erreur sql du entre autre au ' et " ?
il existe PDO depuis PHP5.
PDOStatement->Execute()
[ Mathieu ]
Il y a sûrement des pandas pour ne dépendre de rien

Répondre à Dalida