Enregistrement en bd et mysql_real_escape_string()

Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics


tryan
WRInaute accro
WRInaute accro
 
Messages: 1525
Inscription: Dim Fév 20, 2005 14:14

Enregistrement en bd et mysql_real_escape_string()

Message le Ven Sep 12, 2008 13:13

Bonjour,

J'ai un doute sur la façon d'enregistrer en bd les données de plusieurs champs ...

Suite au formulaire je fais un :
Code: Tout sélectionner
$lechamp12 = mysql_real_escape_string($_POST["ville"]);

Puis j'enregistre les données en bd. Donc les quotes sont échappées par un slash.(ex:L'estacade devient L\'estacade)

Pour l'affichage, dans la boucle while,je fais un:
Code: Tout sélectionner
   
$la_ville = stripcslashes(htmlspecialchars($localisation['ville']));

Tout s'affiche correctement. Sa me vire tout les slash et convertit les balises HTML.

Par contre, si le nom de la ville enregistré contient un apostrophe ( ' ) (ex:L'estacade)
et que je fais un lien du style:
Code: Tout sélectionner
<a href="'.$la_ville.'.php">'.$la_ville.'</a>

et que je récupère sur la page suivante par $_GET:
Code: Tout sélectionner
$la_ville=stripcslashes(htmlspecialchars($_GET["vil"]));

pour ensuite utiliser "$la_ville" comme variable pour une recherche dans ma bd, sa ne fonctionne pas, rien ne s'affiche ... WHY ?
Merci


SuperCureuil
WRInaute passionné
WRInaute passionné
 
Messages: 662
Inscription: Ven Mar 09, 2007 9:44

Message le Ven Sep 12, 2008 13:41

Salut,

<a href="'.$la_ville.'.php">'.$la_ville.'</a>


Y'a aucune variable GET là-dedans, donc pas étonnant que tu ne la récupères pas par la suite :wink:

Code: Tout sélectionner
<a href="'.$la_ville.'.php?vil='.$la_ville.'">'.$la_ville.'</a>


@+

jvgamers
WRInaute discret
WRInaute discret
 
Messages: 77
Inscription: Mar Juil 13, 2004 1:09

Message le Ven Sep 12, 2008 13:44

Ouhla... :)

Alors, petites choses en bataille:
Code: Tout sélectionner
$lechamp12 = mysql_real_escape_string($_POST["ville"]);

Il est important pour éviter une erreur de type notice de tester l'existence de la variable auparavant, de cette manière:
Code: Tout sélectionner
$lechamp12 = isset($_POST["ville"]) ? mysql_real_escape_string($_POST["ville"]) : '';


Alors, ensuite, pas besoin de faire un stripslashes pour supprimer les backslash sur le résultat de la base de données car justement, le fait d'avoir utilisé mysql_real_escape_string permet juste d'éviter les SQL injection et n'ajoute PAS de backslash dans la base de données.

Ensuite, quand tu fais un lien $laville.php, cela modifie le nom du fichier mais ne passe rien en paramètre, normal donc de ne rien récupérer.

Il faut faire un lien du type: fichier.php?ville=$laville


SuperCureuil
WRInaute passionné
WRInaute passionné
 
Messages: 662
Inscription: Ven Mar 09, 2007 9:44

Message le Ven Sep 12, 2008 13:47

Alors, ensuite, pas besoin de faire un stripslashes pour supprimer les backslash sur le résultat de la base de données car justement, le fait d'avoir utilisé mysql_real_escape_string permet juste d'éviter les SQL injection et n'ajoute PAS de backslash dans la base de données.


M'semblait bien :wink:


tryan
WRInaute accro
WRInaute accro
 
Messages: 1525
Inscription: Dim Fév 20, 2005 14:14

Message le Ven Sep 12, 2008 14:20

SuperCureuil autant pour moi sur le lien, c'est parce qu'il est rewrité ^^.
...mysql_real_escape_string permet juste d'éviter les SQL injection et n'ajoute PAS de backslash dans la base de données


Je viens de refaire le teste et chaque entré comportant un apostrophe, un backslash est insérer automatiquement dans ma bd ... d'où l'utilisation de stripcslashes .
Du coup moi pas comprendre ?

Edit: Il n'y aurai pas une histoire de magic quote activé sur mon hébergeur qui ferait que sa merde comme sa ?


tryan
WRInaute accro
WRInaute accro
 
Messages: 1525
Inscription: Dim Fév 20, 2005 14:14

Message le Ven Sep 12, 2008 17:51

Pas de réponses ...ou une suggestion qui pourrait m'avancer?


Bool
WRInaute accro
WRInaute accro
 
Messages: 1290
Inscription: Jeu Fév 26, 2004 15:59

Message le Ven Sep 12, 2008 18:01

Oui les magic_quotes_gpc ont tendance à pourrir toutes les données en entrée.

La plupart des "frameworks" ou applications qui cherchent de la portabilité commencent par désactiver cette saloperie :D

Grosso modo je fais ainsi :
Code: Tout sélectionner
if( ini_get('magic_quotes_gpc') ){
   xxx_gpcStripWalk($_GET);
   xxx_gpcStripWalk($_POST);
   xxx_gpcStripWalk($_COOKIE);
   xxx_gpcStripWalk($_REQUEST);
}
function xxx_gpcStripWalk( & $array )
{
   foreach ( $array as $key => $item ) {
      $newKey = stripslashes($key);
      if ( $newKey !== $key ) {
         unset( $array[ $key ] );
         $array[ $newkey ] = $item;
      }

      if ( is_array($item) === true ) {
         xxx_gpcStripWalk($array[ $newKey ]);
      } else {
         $array[ $newKey ] = stripslashes($item);
      }
   }
}


edit: d'ailleurs en passant, l'utilisation de PDO avec les pseudos requêtes préparées est bien sympathique pour éviter d'oublier les mysql_real_escape_string().
A moins évidement d'utiliser une classe/bibliothèque maison qui s'en charge.


tryan
WRInaute accro
WRInaute accro
 
Messages: 1525
Inscription: Dim Fév 20, 2005 14:14

Message le Ven Sep 12, 2008 19:24

Whaouuuuuuuuuuuuuuuuuuuuuu,merci Bool mais j'ai rien comprit 8O et j'ai vraiment pas le niveau requis pour l'utilisation de ton code ... tu as un décodeur stp ^^.

Il y a un truc que je ne comprend vraiment pas... il est dit quasi partout d'utiliser mysql_real_escape_string() avant l'insertion de données en bd pour ce protéger des injections
Hors si magic quotes est activé (ce qui est mon cas) et qu'on ne peut le désactiver(ce qui est encore mon cas -1&1), celui ci ajoute des backslash.

A la finale je fais comment moi pour insérer correctement mes données tout en les protègent?

En gros:
-Formulaire
-$lechamp12 = $_POST["ville"]; (<-je fais quoi ici ?)
-Vérification du formulaire
-Enregistrement en bd

Merci


Bool
WRInaute accro
WRInaute accro
 
Messages: 1290
Inscription: Jeu Fév 26, 2004 15:59

Message le Ven Sep 12, 2008 19:31

erf... désolé.

Il y a un truc que je ne comprend vraiment pas... il est dit quasi partout d'utiliser mysql_real_escape_string() avant l'insertion de données en bd pour ce protéger des injections

J'aurais tendance à le conseiller aussi, même si c'est parfois un peu "trop".

Hors si magic quotes est activé (ce qui est mon cas) et qu'on ne peut le désactiver(ce qui est encore mon cas -1&1), celui ci ajoute des backslash.


"Mon" code intervient justement dans ce genre de cas : exécuté au début de chaque script il annule l'effet de magic_quotes_gpc.


tryan
WRInaute accro
WRInaute accro
 
Messages: 1525
Inscription: Dim Fév 20, 2005 14:14

Message le Ven Sep 12, 2008 19:40

En gros, je fais un copier/coller de ton code dans la (plutôt les) page(s) contenant le formulaire et c'est tout ?


seebz
WRInaute impliqué
WRInaute impliqué
 
Messages: 476
Inscription: Dim Avr 15, 2007 17:14

Message le Ven Sep 12, 2008 19:43

dans ton cas mysql_escape_string(stripslashes($_POST['data'])) résoud le problème (comme l'a suggéré Bool)


Bool
WRInaute accro
WRInaute accro
 
Messages: 1290
Inscription: Jeu Fév 26, 2004 15:59

Message le Ven Sep 12, 2008 19:49

Yep tryam. "Idéallement", si tu as un script qui contient toutes les fonctions que tu utilises le plus souvent, autant l'y mettre directement.

moaaa
Nouveau WRInaute
 
Messages: 1
Inscription: Ven Jan 30, 2009 14:18

Re: Enregistrement en bd et mysql_real_escape_string()

Message le Ven Jan 30, 2009 14:32

Euh.... je sais pas trop si je suis d'accords sur un point:
J'ai un formulaire de saisie et pour récupérer les valeurs, je fais:

Code: Tout sélectionner
$numAvs = $_SESSION['numAvs'] = mysql_real_escape_string(htmlspecialchars($_POST['numAvs']));


Si je rentre
Code: Tout sélectionner
va'
et que je vais regarder dans ma base de données, l'entrée correspondante est:
Code: Tout sélectionner
va\'


Je travaille avec easyPHP 2.0.0.0

Devrais-je faire un
stripcslashes
pour supprimer les backslashes (ce qui accomplirait la tâche) mais par contre, le code serait sujet aux injections? Pourriez-vous confirmer?
Et sinon, y'aurait-il une autre alternative?


Marie-Aude
WRInaute accro
WRInaute accro
 
Messages: 4937
Inscription: Lun Juin 05, 2006 14:15

Re: Enregistrement en bd et mysql_real_escape_string()

Message le Ven Jan 30, 2009 15:56

Sinon je crois que tu peux désactiver les magic quotes en mettant un fichier php.ini à la racine de ton site sur 1&1 :) même en mutu


Formation recommandée sur ce thème :

Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités