Enregistrement en bd et mysql_real_escape_string()

WRInaute passionné
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:
$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:
$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:
<a href="'.$la_ville.'.php">'.$la_ville.'</a>
et que je récupère sur la page suivante par $_GET:
Code:
$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
 
WRInaute discret
Ouhla... :)

Alors, petites choses en bataille:
Code:
$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:
$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
 
WRInaute impliqué
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:
 
WRInaute passionné
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 ?
 
WRInaute passionné
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:
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.
 
WRInaute passionné
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
 
WRInaute passionné
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.
 
WRInaute passionné
En gros, je fais un copier/coller de ton code dans la (plutôt les) page(s) contenant le formulaire et c'est tout ?
 
WRInaute passionné
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.
 
Nouveau WRInaute
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:
$numAvs = $_SESSION['numAvs'] = mysql_real_escape_string(htmlspecialchars($_POST['numAvs']));

Si je rentre
Code:
va'
et que je vais regarder dans ma base de données, l'entrée correspondante est:
Code:
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?
 
WRInaute accro
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
 
Discussions similaires
Haut