Aide - Recherche - Membres - Calendrier
Version complète : Un UPDATE qui n'envoit que du vide :'(
Forum Développeur - Administration serveur, programmation et base de données > Programmation > PHP
fredemaster
Voilà, j'ai un problème assez étrange. J'effectue un update tout simple et une fois sur trois, il insère du vide dans ma table icon_eek.gif

Voici mon p'tit code :

Code

//Récupération des variables
$lien = $_POST["lien"];
$commentaire = $_POST["commentaire"];
$cle = $_GET["cle"];

//Envoi des valeurs dans la table
$update_lien = mysql_query("UPDATE mpf_fr_liens SET lien='$lien', commentaire='$commentaire' WHERE cle_lien=$cle");

//Test des variables envoyées
echo$lien."<br />";
echo$commentaire."<br />";

if($update_lien)
{
echo"Le lien a été modifié avec succès.";
}
else
{
echo"Désolé, le lien n'a pu être modifié, veuillez réssayer plus tard.".mysql_error();
}


Je fais un echo des variables que j'envois et celles-ci s'affichent correctement. Mais au lieu de retrouver les nouvelles valeurs dans ma table, il a vidé l'enregistrement que je voulais modifier... Bref, il envoit du vide.

Je deviens fou. icon_lol.gif

Merci d'avance !
passicon
moi aussi sa m'arrive parfois,
je pensse que c'est parcerque tu as des caractéres speciaux dans ta variables commentaire ou lien comme par exemle " ou ' ou encor , regarde si ce n'est pas sa icon_wink.gif
Antoine
Avec un code tel qu'il est, je supprime toute ta base de données...

Attention aux injections SQL smile.gif
passicon
tu peut expliquer un peu plus antoine?
tu m'inquiete icon_redface.gif
fredemaster
Ca m'inquiète aussi...
fredemaster
fredemaster (May 22 2005, 05:54 PM) a dit :
Ca m'inquiète aussi...
*


J'ai trouvé ça : http://www.php.net/manual/fr/security.data...l-injection.php
jep
passicon (May 22 2005, 06:48 PM) a dit :
tu peut expliquer un peu plus antoine?
tu m'inquiete icon_redface.gif


En l'etat, avec le code qui est utilisé, a votre avis, que va-t-il se passer si la variable $lien est vide et si la variable $commentaire contiens la chaine : ';

Vous allez vous retrouver avec la requette suivante :
Code
UPDATE mpf_fr_liens SET lien='', commentaire='';

Ce qui aurra pour effet de vider la table !!!!!!!!!!!!!!!

C'est ça une attaque SQL Injection !

Un peu de seines lectures pour limiter les degats :
> http://www.phpsecure.info/v2/article/InjSql.php
> http://www.phpsecure.info/v2/article/phpmysql.php
> http://www.phpsecure.info/v2/article/php-security.php

La securité en PHP n'est pas à négliger par les programmeur en effet, 99% des failles connus dans les application PHP sont dû à de mauvaises politiques de sécurité des developpeurs... il faut faire attention lorsque vous codez icon_wink.gif
fredemaster
Merci ! icon_biggrin.gif Je vais étudier ça tout de suite.

Sinon, si vous avez d'autres idées pour l'UPDATE vide... En ce qui concerne les variables contenant des caractères spéciaux, je vire avant l'envoi les ' et caractères non SGML donc je pense que ça n'est pas ça (je n'ai pas affiché tout le code)... Je vais tout de même faire d'autres testes.

Antoine
Résoud tes injections et ton problème trouvera ss doute solution smile.gif
fredemaster
En fait, je change déjà les " et ' comme ça :

Code

$variable = ereg_replace("\'", "&rsquo;", $variable);
$variable = ereg_replace("\"", "&quot;", $variable);


Il y a un autre truc qui me semble assez bizarre, j'ai remarqué que parfois, pour les INSERT, la requête était exécutée deux fois.
Une fois avec mes variables bien remplies et l'autre fois à vide. C'est tout à fait désagréable...
Alors je me dis qu'il se passe sans doute la même chose pour mes UPDATE, il modifierait une fois mon code avec mes variables puis une deuxième fois avec des variable vide, ce qui expliquerait qu'au final, l'enregistrement se retrouve vide.

De plus, après plein de tests, je me suis aperçu que tout cela était assez aléatoire. Je fais quelques test puis je réinitialise la DB pour voir si mes scripts vont réagir de la même façon et je m'aperçois que non. Ce qui est assez dingue. icon_eek.gif

Alors voilà la question : comment une requête peut-elle s'exécuter deux fois de suite si elle n'est écrite qu'une fois ?

Peut-être que la page est appelée deux fois... :s Mais alors, les variable reviendraient à vide la deuxième fois et après avoir tout exécuté, mon script me revoit bien des valeurs de variables correctes... icon_eek.gif
Antoine
pour protéger, utilise plutot : http://be.php.net/manual/fr/function.mysql-escape-string.php

Etrange, montre nous ton code actuel (ps: utilise les balises [ php] stp)
Thanh
Antoine (May 22 2005, 09:17 PM) a dit :
Résoud tes injections et ton problème trouvera ss doute solution smile.gif
*




C'est limite Yoda-esque ta phrase icon_wink.gif
Antoine
solo (May 23 2005, 08:05 AM) a dit :
C'est limite Yoda-esque ta phrase  icon_wink.gif
*


Presque icon_biggrin.gif
fredemaster
Dans le fichier qui envoi les données, j'ai :

Code

//Le fichier qui gère la connexion, voir plus bas.
include("connect.php");

//Le fichier dans lequel se trouve la fonction modifier_quotes(), voir plus bas.
include("mq.php");

//Je récupère mes variables POST et GET
$cle = $_GET["cle"];
$date = $_POST["date"];
$titre_fr = $_POST["titre_fr"];
$titre_nl = $_POST["titre_nl"];
$titre_en = $_POST["titre_en"];
$commentaire_fr = $_POST["commentaire_fr"];
$commentaire_nl = $_POST["commentaire_nl"];
$commentaire_en = $_POST["commentaire_en"];

//Je traîte les variables texte
modifier_quotes($titre_fr);
modifier_quotes($titre_nl);
modifier_quotes($titre_en);
modifier_quotes($commentaire_fr);
modifier_quotes($commentaire_nl);
modifier_quotes($commentaire_en);

//Je modifie mon enregistrement
$update_archi = mysql_query("UPDATE all_evenements_archive SET date='$date', titre_fr='$titre_fr', titre_nl='$titre_nl', titre_en='$titre_en', ".
"commentaire_fr='$commentaire_fr', commentaire_nl='$commentaire_nl', commentaire_en='$commentaire_en' ".
"WHERE id_evenement_archive=$cle");


//Je vérifie si la réquête a été exécutée.
if($update_archi)
{
echo"L'événement a bien été modifié.";
}
else
{
echo"L'événement n'a pu être modifié. Veuillez réessayer plus tard.".mysql_error();
}


Dans mon fichier de connexion :
Code

$serveur     = "serveur";
$utilisateur = "utilisateur";
$motDePasse  = "";
$base        = "ma_base";


 $idConnexion = mysql_connect($serveur, $utilisateur, $motDePasse);
 if (!$idConnexion)
{
echo "Connexion au serveur ratée<br>";
}

$connexionReussie = mysql_select_db($base);
if (!$connexionReussie)
{
echo "Connexion à la base ratée";  
}



Dans le fichier mq.php
Code

//Modification des quotes et de certains caractères non sgml.
function modifier_quotes(&$variable)
{
$variable = ereg_replace("\'", "&rsquo;", $variable);
$variable = ereg_replace("\"", "&quot;", $variable);
$variable = ereg_replace("«", "&quot;", $variable);
$variable = ereg_replace("»", "&quot;", $variable);
$variable2 = ereg_replace("…", "&hellip;", $variable2);
$variable2 = ereg_replace("’", "&rsquo;", $variable2);
$variable2 = ereg_replace("œ", "oe", $variable2);
}


Sorry, j'ai voulu utiliser les balises [php] mais ça générait une erreur à l'envoi...
Antoine
Fais un If empty ça permettra de savoir si c'est la variable qui est vide ou si la requete SQL est mauvaise.


Aussi : mysql_escape_string plutot que ton quote modifier smile.gif
jep
Bon, bon, bon... ça va pas tout ça ! En l'état, ton script souffre toujours de grave problème de sécurité !

Par exemple : Que va-t-il se passer si je change manuellement la valuer de la variable $cle (en modifiant l'url !)... je vais pouvoir, au choix, modifier n'importe quel enregistrement de mon choix (mais bon, je suppose que tu à fait une vérification des droit de modification avant l'envoi de tes données) ou bien pouvoir assigné la valeur de mon choix (une chaine vide par exemple) à l'enssemble des enregistrement de ta table car tu ne vérifie pas la validité de ta variable !

La sécurisation d'un script, c'est de commencer par vérifier la validité des informations envoyé par l'utilisateur... et après seulement, de faire les operations que l'on a envi de faire !

Donc, le minimum à faire pour la sécurité dans ton cas :

1 - S'assurer que toutes les variables que tu attend de la part de l'utilisateur existe
2 - S'assurer que ta clé à une valeur valide (bon format) et que l'utilisateur à le droit d'agir dessus (authentification des utilisateurs !)
3 - S'assurer que tous les caractères problématique avec MySQL sont correctement echappé

Pour le point 1, une simple utilisation de la fonction isset() suffit (eventuellement, tu peut utiliser empty() si en plus tu veux verifier que la variable n'est pas vide !)

Pour le point 3 utilise la fonction mysql_escape_string() ou mysql_real_escape_string() plutot que ta fonction personalisé icon_wink.gif

Pour le point 2, le plus simple et d'utilisé une cle numerique (format très facile à vérifier) et d'utiliser un système d'authentification des utilisateur systématique sur tous les script chargé de modifier des données

Pour bien sécurisé un script il faut suivre une simple règle : l'utilisateur est toujours le maillon faible de la sécurité, il ne faut donc jamais faire confiance aux donné envoyé par les utilisateurs icon_smile.gif
fredemaster
Merci, c'est chouette de prendre du temps pour m'aider ! icon_biggrin.gif

En ce qui concerne ce script, l'utilisateur est unique et il s'authentifie pour lancer une session qui est vérifiée sur chaque page.

Quand j'utilise mysql_escape_string() sur par exemple la chaîne "C'est super" il me retourne "c\\\'est super !" et non pas "c\'est super". En fait, l'échapement est inséré par défaut, on dirait.

Pour vérifier le contenu, j'utilise un petit script javascript que j'appelle avec un onsubmit dans mon <form>. Donc onsbumit="return ma_fonction();" Si c'est mauvais, je retourne false, si c'est bon, je ne retourne rien et la page est lancée. Ce script pourrait-il poser problème ?

Je rappelle le problème de base, il arrive que mon script, dans le même cas va une fois envoyer du vide et une autre fois mes variables. icon_eek.gif Oui, dans le même cas. Car j'effectue mes tests, je note, je réinitialise la DB, je recommence et ça évolue différemment... OOOOH ! icon_sad.gif

Je continue les tests... Mais ça me rend un peu dingue. icon_mrgreen.gif
qwix
Php
// Quote variable to make safe
function quote_smart($value)
{
// Stripslashes
if (get_magic_quotes_gpc()) {
$value = stripslashes($value);
}
// Quote if not integer
if (!is_numeric($value)) {
$value = "'" . mysql_real_escape_string($value) . "'";
}
return $value;
}


echo quoteSmart($var) ;

smile.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2009 Invision Power Services, Inc.