Aller au contenu

Des slashes en trop


furious Gontran

Sujets conseillés

Salut,

Je fais un formulaire qui me renvois une valeur de test: L'e test

Je renvois mon formulaire a une page de verification ou l'utilisateur verifis les données a rentrer.

Ma valeur de test se retrouve directement sous cette forme: L/'e test

Une fois l'entrée validé, ma valeur de test deviens: L///'e test.

J'utilise wamp et php my admin.

Mais ce qui me fais le plus halluciner c'est que les slashes s'ajoute alors que je n'ais absolument rien dans mon code pour ajouter des slashes.

En gros je suis perplexe...

Lien vers le commentaire
Partager sur d’autres sites

Salut Furious Gontran,

As tu des appels à "addslaches()". Dans ce cas, avant d'afficher tes infos il faut faire appel à stripslashes().

Ou alors, tu as le magic_quotes_gpc ou magic_quotes_runtime à "on" dans le fichier de config.

Voici un bout de code venant du manuel php:

<?php 
echo get_magic_quotes_gpc();         // 1
echo $_POST['lastname'];             // O\'reilly
echo addslashes($_POST['lastname']); // O\\\'reilly

if (!get_magic_quotes_gpc()) {
  $lastname = addslashes($_POST['lastname']);
} else {
  $lastname = $_POST['lastname'];
}

echo $lastname; // O\'reilly
$sql = "INSERT INTO lastnames (lastname) VALUES ('$lastname')";
?>

Dan

Lien vers le commentaire
Partager sur d’autres sites

ok, merci Dan...

Je teste et je te donne des nouvelles...

Avant que tu reponde j'ais trouvé ca sur le net:

function MyAdd($chaine ) {

  return( get_magic_quotes_gpc() == 1 ?

          $chaine :

          addslashes($chaine) );

}

j'ais un peu de mal a comprendre ce code, pourrais tu m'eclairer la dessus ?

surtout le : return( get_magic_quotes_gpc() == 1 ?

------------------------------

Sinon, j'ais compris mon erreur.

En fait c'est le magic_quotes_gpc qui est a on.

Quand les données viennent de mon formulaire il ajoute un slash (methode Post)

Apres verification mes données sont passées en Get

Donc il ajoute encore des slashes.

...

Modifié par furious Gontran
Lien vers le commentaire
Partager sur d’autres sites

Il faut interpréter la chaîne complète... du style:

si (test=="vrai")? action si "vrai" : autres actions si "non-vrai";

function MyAdd($chaine ) {

  return( get_magic_quotes_gpc() == 1 ?

          $chaine :

          addslashes($chaine) );

}

Si la fonction get_magic_quotes_gpc() retourne 1, la fonction renvoie la chaîne intouchée, sinon elle appelle addslashes pour mettre les slashes à la chaîne avant de la renvoyer.

Toujours ces abbréviations de type

echo a > 0 ? "positif" : "négatif ou nul";

A+

Dan

Lien vers le commentaire
Partager sur d’autres sites

salut pourquoi n'utilise tu pas stripslashes de genre

echo stripslashes($test);

ca enleve les slashes qui ont ete ajoutés par un addslashes par exemple ou bien par urlencode

++

-abL^

Lien vers le commentaire
Partager sur d’autres sites

Pour prendre les choses depuis le début (parce que des fois avoir le contexte peut aider à comprendre) :

1. Quand on fait une requête SQL, les délimiteurs de chaînes de caractères sont des apostrophes. Pour utiliser une chaîne qui contient une apostrophe dans une requête SQL il faut l'échapper. L'échapper c'est à dire la mettre sous une forme reconnue par le serveur de base de données. C'est généralement soit en la précédant d'un backslash (\') soit en la doublant (''). Cet échappement est "mangé" par le serveur de base de données, il n'est donc pas nécessaire de l'enlever quand on récupère la donnée qu'on y avait inséré.

Si on l'oublie toutes les chaînes qui contiennent des apostrophes feront des requêtes SQL qui posent problème (soit qui échouent, soit qui font un problème de sécurité)

Sous PHP la fonction qui permet de rajouter des backslash est addslashes(). Il existe une fonction qui fait l'opération inverse nommée stripslashes().

2. Au début de PHP les développeurs de PHP ont pensé qu'il serait une bonne idée de faciliter la vie de l'utilisateur en faisant automatiquement ces addslashes, comme ça il ne risque pas d'oublier.

Il y a donc une directive de configuration dans le php.ini qui s'appelle "magic_quotes_gpc". Quand elle est activé (ce qui était le cas par défaut et chez quasiment tous les hébergeurs) PHP fait un addslashes sur tout ce qu'il récupère venant de l'utilisateur (formulaires, cookies, valeurs dans l'URL).

Ce que tu vois c'est simplement cette directive en action.

- Tu rentres : l'exemple. PHP réceptionne et ajoute les slash, ton script reçoit : l\'exemple.

- Ton script affiche ce qu'il a reçu : l\'exemple. Tu valides donc tu renvoies cette chaîne. PHP la reçoit a nouveau, il va rajouter un slash devant chaque slash et chaque apostrophe. Ton script va donc recevoir l\\\'exemple et te l'afficher.

3. Le problème arrive donc comme c'est que les deux postulats fait au (2) est faux.

- Toutes les données ne sont pas destinées à passer en SGBD. La plupart sont même faites pour être réaffichées directement pour confirmation validation, ou traitées par code avant insertion. Au lieu d'oublier de faire des addslashes on oublie de faire des stripslashes là où le addslashes fait par défaut était inutile/mauvais.

- Toutes les données ne viennent pas de l'utilisateur. C'est le plus gros problème de ce fonctionnement. On va devoir savoir si une chaîne vient de formulaire, de fichier, de base ou d'ailleurs pour savoir comment la traiter (savoir si elle a déjà eu un addslashes ou pas). Au lieu de simplifier on complexifie grandement.

Du coup maintenant la politique c'est de désactiver le magic_quotes_gpc dans la configuration. C'est ce qui est fait dans la config par défaut des dernières versions de PHP.

Le problème qui survient est que du coup on ne sait pas toujours dans quelle configuration on est. Il y a donc la fonction get_magic_quotes_gpc() qui retourne true ou false suivant qu'elle est activée ou pas.

Je vous propose donc 2x3 solutions au choix (par ordre de préférence) :

** En prenant pour base le fait de ne pas faire un addslashes automatique (conseillé)

A- Tu changes la configuration de ton serveur pour mettre magic_quotes à Off (c'est la valeur conseillée et par défaut sur toutes les versions récentes de PHP) et tu n'oublies pas de faire un addslashes() ou un mysql_real_escape_string() à chaque fois que tu met une chaîne de caractère dans une requête SQL.

B- Tu n'as pas la main sur la configuration ou tu veux un script portable. Tu fais donc comme au A mais tu exécutes le code suivant à chaque début de page pour "corriger" PHP si jamais la directive de configuration était activée :

function recursiveStripSlashes($a) {
 if (is_array($a)) {
   foreach($a as $name => $value) {
     $a[$name] = recursiveStripSlashes($value);
   }
 } else {
   $a = stripslashes($a);
 }
 return $a;
}
if (get_magic_quotes_gpc()) {
  $_REQUEST = recursiveStripSlashes($_REQUEST);
  $_GET = $HTTP_GET_VARS = recursiveStripSlashes($_GET);
  $_COOKIE = $HTTP_COOKIE_VARS = recursiveStripSlashes($_COOKIE);
  $_POST = $HTTP_POST_VARS = recursiveStripSlashes($_POST);
}

C- Tu fais comme A mais à chaque fois que tu utilises une donnée de REQUEST/POST/GET/COOKIE tu la fais passer à la main dans la fonction correctStripSlashes() suivante :

function correctStripSlashes($a) {
 if (get_magic_quotes_gpc()) $a = recursiveStripSlashes($a);
 return $a;
}
function recursiveStripSlashes($a) {
 if (is_array($a)) {
   foreach($a as $name => $value) {
     $a[$name] = recursiveStripSlashes($value);
   }
 } else {
   $a = stripslashes($a);
 }
 return $a;
}

*** Les mêmes dans le sens inverse (déconseillé) :

A- Tu changes la configuration de ton serveur pour mettre magic_quotes à On (c'est la valeur conseillée et par défaut sur toutes les versions récentes de PHP) et tu n'oublies pas de faire un stripslashes() à chaque fois que tu met une chaîne de caractère qui vient de l'utilisateur ailleurs que dans une requête SQL.

B- Tu n'as pas la main sur la configuration ou tu veux un script portable. Tu fais donc comme au A mais tu exécutes le code suivant à chaque début de page pour "corriger" PHP si jamais la directive de configuration était activée :

function recursiveAddSlashes($a) {
 if (is_array($a)) {
   foreach($a as $name => $value) {
     $a[$name] = recursiveAddSlashes($value);
   }
 } else {
   $a = addslashes($a);
 }
 return $a;
}
if (!get_magic_quotes_gpc()) {
  $_REQUEST = recursiveAddSlashes($_REQUEST);
  $_GET = $HTTP_GET_VARS = recursiveAddSlashes($_GET);
  $_COOKIE = $HTTP_COOKIE_VARS = recursiveAddSlashes($_COOKIE);
  $_POST = $HTTP_POST_VARS = recursiveAddSlashes($_POST);
}

C- Tu fais comme A mais à chaque fois que tu utilises une donnée de REQUEST/POST/GET/COOKIE tu la fais passer à la main dans la fonction correctAddSlashes() suivante :

function correctAddSlashes($a) {
 if (!get_magic_quotes_gpc()) $a = recursiveAddSlashes($a);
 return $a;
}
function recursiveAddSlashes($a) {
 if (is_array($a)) {
   foreach($a as $name => $value) {
     $a[$name] = recursiveStripSlashes($value);
   }
 } else {
   $a = stripslashes($a);
 }
 return $a;
}

Modifié par Ganf
Lien vers le commentaire
Partager sur d’autres sites

Excellente synthèse, Ganf.

J'ajouterais juste 2x3 petites choses, s'il en était besoin. Je suis toujours confronté à ce problème de slashes, étant donné que je n'ai jamais (ou presque) la même configuration en ocal que les serveurs sur lesquels je travaille.

Les slashes sont toujours source d'ennui, il faut donc toujours tester les champs texte et les données envoyées à une base avec des apostrophes, des slashes,..

Enfin, le meilleur moyen de ne pas se tromper est d'adopter une 'technique', et d'y rester, de s'en tenir. Si l'on entre un code comme ceci :

echo "bonjour";

il ne faut pas, 2 lignes plus loin, écrire :

echo 'bonjour';

On adopte une manière de coder, et on la respecte jusqu'au bout, sinon on va au devant de grands ennuis.

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...