Injection d'Anti-Slash dans la BDD

Rechercher

Injection d'Anti-Slash dans la BDD

Par Friks  -  14 reponses  -  Le 06/11/2007 23:07  -  Editer  - 

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 23:34  -  Haut de page  - 

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.

<?php
function myStripslashes($myString)
{
  if(1 === ini_get('magic_quotes_gpc'))
    {
       // Suppression des antislashes à la con ajoutés automatiquement par PHP
       $myString = stripslashes($myString);
    }
    return $myString;
}
function protectStringForDatabase($myString)
{
    $myString = myStripslashes($myString);
    // Renvoi de la chaine protégée contre les injections SQL
    return mysql_real_escape_string($myString);
}
?>

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 08:25  -  Haut de page  - 

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 09:03  -  Haut de page  - 

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

<?php
function myStripslashes($myString)
{
  if('1' === ini_get('magic_quotes_gpc'))
    {
       // Suppression des antislashes à la con ajoutés automatiquement par PHP
       $myString = trim(stripslashes($myString));
    }
    return $myString;
}
?>

@+

Hugo.

 
Par Friks  -  Le 11/11/2007 21:01  -  Haut de page  - 

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 22:22  -  Haut de page  - 

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 20:00  -  Haut de page  - 

Ma BDD est entièrement en utf8_general_ci.

Et dans ma ma page j'ai la ligne:

 

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 23:53  -  Haut de page  - 

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 19:26  -  Haut de page  - 

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

 
Par Emacs  -  Le 14/11/2007 00:34  -  Haut de page  - 

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

 
Par Friks  -  Le 18/11/2007 21:06  -  Haut de page  - 

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 21:53  -  Haut de page  - 

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

 
Par Friks  -  Le 18/11/2007 22:05  -  Haut de page  - 

Oui je l'ai.

 
Par Friks  -  Le 19/11/2007 20:50  -  Haut de page  - 

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 00:03  -  Haut de page  - 

Je ferai ça prochainement :)

 

Ajouter une réponse à la discussion

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

Identifiez-vous
Join |  ID/MDP? |