Protection requete SQL

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)

10 réponses

  1. 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)
    0
    1. 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.
      0
  2. simplement utiliser mysql_real_excape_string ?
    cette fonction protège aussi contre les balise html et JS?
    0
    1. 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 .
      0
      1. 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'] );
        0
    2. 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.
      0
      1. Ok merci :)
        quel est la différence entre htmlentities et htmlspecialchars ?
        0
        1. 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.
          0
        2. @pyschopathePour 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
          0
        3. @Dr ZoidbergTout à 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.
          0
      2. 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 ?
        0
        1. 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.
          0
        2. @pyschopatheOk merci.
          Quant tu dis "si tu affiches les données en HTML"
          Il y a moyen de les afficher autrement?
          0
        3. @okuniBah 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 !
          0
        4. @okuniDe rien ! Pour mes posts précédent, ccm a converti les caractères HTML donc il fallait lire : "s'il lit é, il affichera é".
          0
      3. Contributeur
        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()
        0