Injection d'Anti-Slash dans la BDD - Apprendre-PHP.com

Rechercher
Boutique en ligne, solution e-commerce, script PHP et PERL : RAYNETTE

Injection d'Anti-Slash dans la BDD

Par Friks -  14 reponses -  Le 06/11/2007 -  Flux RSS - 

Bonsoir,

je viens de finir de coder un site. Mais j'al malheureusement un problème. Lorsque je désire créer un billet d'humeur (j'ai codé une esquisse de blog) des anti-slash apparaissent automatiquement à chaque apostrohpe.

J'ai dans mon fichier init.php (que j'inclus à chaque page) la ligne suivante: ini_set('magic_quotes_gpc', 0)

Je sais que cette ligne empêche normalement de mettre des anti-slash mais là rien n'y faire ils viennent tout de même.

Si ca peut aider, j'héberge mon 'blog' sur un FTP free.

Merci d'avance à vous !

 

Réponses apportées à cette discussion

Par Emacs -  Le 06/11/2007 - 

Salut Romain,

En fait, la fonction ini_set() peut être désactivée chez certains hébergeurs. Il se peut donc que chez Free ce soit le cas, ce qui ne m'étonnerait pas du tout d'un point de vue sécurité.

Il faut donc que tu es recours à la dernière méthode que je t'ai donnée, à savoir utiliser la fonction suivante qui va échapper correctement les caractères dangereux d'une chaine quelque soit la configuration des magic_quotes_gpc sur le serveur. C'est un peu bourrin comme méthode mais bon avec Fre, on n'a pas le choix.

Empêcher les antislashes quelque soit l'état des magic_quotes_gpc
  1. <?php
  2.  
  3. function myStripslashes($myString)
  4. {
  5. if(1 === ini_get('magic_quotes_gpc'))
  6. {
  7. // Suppression des antislashes à la con ajoutés automatiquement par PHP
  8. $myString = stripslashes($myString);
  9. }
  10.  
  11. return $myString;
  12. }
  13.  
  14. function protectStringForDatabase($myString)
  15. {
  16. $myString = myStripslashes($myString);
  17.  
  18. // Renvoi de la chaine protégée contre les injections SQL
  19. return mysql_real_escape_string($myString);
  20. }
  21.  
  22. ?>

Voici deux fonctions. La première applique un stripslashes() si magic_quotes_gpc est à On, sinon renvoit directement la chaine passée en paramètre. Cette fonction est à utiliser quand tu réaffiches des informations postées dans ton formulaire ou bien quand tu reçois une variable en GET, POST, COOKIE ou REQUEST.

Par contre, lorsque tu envoies en BDD, tu appliques la fonction suivante qui va aussi appliquer le stripslashes() si nécessaire puis protéger ta requête SQL des éventuels piratages par injection SQL.

Je t'avouerai que ce sont deux solutions assez bourrines mais bon sur Free pas le choix visiblement. Il est évident que la meilleure pratique à adopter est d'avoir magic_quotes_gpc à Off sur son serveur et filtrer convenablement toutes les données GET, POST, COOKIE et REQUEST. 

Dis moi si ça marche bien ;)

Hugo.

 
Par Palleas -  Le 07/11/2007 - 

Perso j'aurai aussi trimé la chaine ^^

 Mais faudrait corriger un petit truc :

  • if(1 === ini_get('magic_quotes_gpc'))
  •  Sachant que ini_get() return une valeur de type string, ca risque de ne pas marcher ta condition, non ? ;)

     
    Par Emacs -  Le 07/11/2007 - 

    Effectivement ini_get() retourne une chaine donc il faut transformer la fonction de cette manière :

    1. <?php
    2.  
    3. function myStripslashes($myString)
    4. {
    5. if('1' === ini_get('magic_quotes_gpc'))
    6. {
    7. // Suppression des antislashes à la con ajoutés automatiquement par PHP
    8. $myString = trim(stripslashes($myString));
    9. }
    10.  
    11. return $myString;
    12. }
    13.  
    14. ?>

    @+

    Hugo.

     
    Par Friks -  Le 11/11/2007 - 

    Bonsoir,

    j'ai toujours un soucis. Avec la fonction que Emacs à posté plus haut je rencontre un probleme.

    Lorsque j'insère dans ma BDD un texte comportant le caractère 'à' celui est remplacé par un '?' 

    lorsque je recupère pour l'afficher à l'écran.

    Pourquoi à votre avis?

     

    Merci d'avance! 

     
    Par Emacs -  Le 11/11/2007 - 

    Ceci est du à la différence d'encodage entre ta BDD, tes fichiers PHP et l'encodage de la page HTML finale. Essaie de mettre le même encodage (iso-8859-1 [aussi appellé latin1] ou utf-8) partout et ça ira mieux.

     
    Par Friks -  Le 12/11/2007 - 

    Ma BDD est entièrement en utf8_general_ci.

    Et dans ma ma page j'ai la ligne:

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

     

    C'est bon ou pas? A savoir que j'ai essayer avec l'interclassement du texte récuperer en latin1_bin , en latin_general_cs... 

    Je me doute que non sinon j'aurais pas un '?'  à la place de mes 'à' :p 

     

     
    Par Emacs -  Le 12/11/2007 - 

    Quel est l'encodage d'enregistrement de ton fichier PHP ?

    Tu l'obtiens dans Notepad++ dans : format > encodage si mes souvenirs sont bons.

    ++ 

     

     
    Par Friks -  Le 13/11/2007 - 

    Ma page est encodée en ANSI UTF-8 sans BOM.

     

     
    Par Emacs -  Le 14/11/2007 - 

    Et les autres includes qui importent cette page ou bien qui sont importés dans cette page ?

     

     
    Par Friks -  Le 18/11/2007 - 

    Désolé de répondre si tard.

    Dans ma page coté utilisateu: tout est en UTF-8 sans BOM

    Et du coté administrateur (lorsque je valide mon billet et donc l'insertion de données) seul mon include de vérification de session ainsi qu'un include d'upload de fichier ne sont pas en UTF-8 sans BOM mais en UTF-8 tout court. N'ayant pas de lien direct avec les données insérées dans la BDD je ne pense pas que ca vienne de là.

     

     

     
    Par Emacs -  Le 18/11/2007 - 

    Est-ce que tu as la balise meta http-equiv dans ta page ?

     

     
    Par Friks -  Le 18/11/2007 - 

    Oui je l'ai.

     

     
    Par Friks -  Le 19/11/2007 - 

    Yop Emacs,

    bon apparemment ca marche maintenant.

    Merci de votre aide en tout cas.

    Sachez que je n' hésiterais pas à re-poster si je rencontre un auter problème.

    ^_^ 

     

    Ps: ah oui. serait-il possible de développer une fonction éditer sur votre site pour mettre à jour nos post? ca m'ennuie de faire un double post pour un problème résolu. 

     

     
    Par Emacs -  Le 20/11/2007 - 

    Je ferai ça prochainement :)

     

    Ajouter une réponse à la discussion

    Seuls les membres loggués sont autorisés à poster dans les forums !