Injection sql

Résolu
Bonjour a tous,

Je ens d installer le logiciel havij surmon ordi car on me la conseiller pour tester mon site

Par contre je viens de me rendre compte que l on peut acceder a la base de donné de mon site

Que dois je faire pour bloquer l acces

J ai fait un autre site sur le meme principe que le 1er mais celui ci n a aucune faille

Meri de votre aide

12 réponses

  1. Salut.
    Utilise mysql_real_escape_string pour sécuriser tes variables provenant de l'utilisateur (GET, POST et COOKIE principalement) avant d'effectuer les requêtes SQL.
    1. merci de ta reponse

      Mais je dois l utiliser ou et comment

      Merci de ton aide
      1. Par exemple :
        $sql = 'SELECT COUNT(*) AS nb FROM table WHERE column="'.mysql_real_escape_string($_GET['where'].'"';

        Ou :
        $where = mysql_real_escape_string($_GET['where']);
        $sql = 'SELECT COUNT(*) AS nb FROM table WHERE column="'.$where.'";
        1. Merci de ta reponse

          mais je ne vois pas trop comment tu utilise ton where

          sur mon exemple tu me conseil comment?

          $sql = 'INSERT INTO vision (id, nom, serie, batie, adresse, cp, ville, département, tel, portable, demande, m2, caveradier, decoré, couvert, terrain, quand, serie, connu) VALUES("", "'.mysql_escape_string($_POST['f_1']).'", "'.mysql_escape_string($_POST['f_2']).'", "'.mysql_escape_string($_POST['f_3']).'", "'.mysql_escape_string($_POST['f_15']).'", "'.mysql_escape_string($_POST['f_16']).'", "'.mysql_escape_string($_POST['f_17']).'", "'.mysql_escape_string($_POST['f_4']).'", "'.mysql_escape_string($_POST['f_5']).'", "'.mysql_escape_string($_POST['f_18']).'", "'.mysql_escape_string($_POST['f_6']).'", "'.mysql_escape_string($_POST['f_7']).'", "'.mysql_escape_string($_POST['f_8']).'", "'.mysql_escape_string($_POST['f_9']).'", "'.mysql_escape_string($_POST['f_10']).'", "'.mysql_escape_string($_POST['f_11']).'", "'.mysql_escape_string($_POST['f_12']).'", "'.mysql_escape_string($_POST['f_13']).'", "'.
          mysql_escape_string($_POST['f_14']).'" )';
          mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());

          exit();

          Merci
          1. Comme tu l'as fait, c'est correct.
            Si tu veux alléger un peu tes requête, il faudra stocker le résultat de mysql_real_escape_string() dans des variables. Dans mon exemple, j'en avais qu'une seule : $where. Mais sur le tiens, tu auras besoin d'autant de variables que de mysql_real_escape_string().

            Pour rendre ton code plus clair, je te propose de faire comme ceci. C'est plus long mais ça facilite la lecture :
            $sql = 'INSERT INTO vision (
            	id,
            	nom,
            	serie,
            	batie,
            	adresse,
            	cp,
            	ville,
            	département,
            	tel,
            	portable,
            	demande,
            	m2,
            	caveradier,
            	decoré,
            	couvert,
            	terrain,
            	quand,
            	serie,
            	connu
            ) VALUES(
            	"",
            	"'.mysql_escape_string($_POST['f_1']).'",
            	"'.mysql_escape_string($_POST['f_2']).'",
            	"'.mysql_escape_string($_POST['f_3']).'",
            	"'.mysql_escape_string($_POST['f_15']).'",
            	"'.mysql_escape_string($_POST['f_16']).'",
            	"'.mysql_escape_string($_POST['f_17']).'",
            	"'.mysql_escape_string($_POST['f_4']).'",
            	"'.mysql_escape_string($_POST['f_5']).'",
            	"'.mysql_escape_string($_POST['f_18']).'",
            	"'.mysql_escape_string($_POST['f_6']).'",
            	"'.mysql_escape_string($_POST['f_7']).'",
            	"'.mysql_escape_string($_POST['f_8']).'",
            	"'.mysql_escape_string($_POST['f_9']).'",
            	"'.mysql_escape_string($_POST['f_10']).'",
            	"'.mysql_escape_string($_POST['f_11']).'",
            	"'.mysql_escape_string($_POST['f_12']).'",
            	"'.mysql_escape_string($_POST['f_13']).'",
            	"'. mysql_escape_string($_POST['f_14']).'"
            )'; 
            	
            mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error()); 
            1. OK merci effectivement c est plus clair comme ca

              On va faire plus simple je prends seulement sur 2 requete mais je ne vois pas ou utiliser ta variable "'.mysql_real_escape_string($_GET['where'].'"

              $sql = 'INSERT INTO vision (
              id,
              nom,
              ) VALUES(
              "",
              "'.mysql_escape_string($_POST['f_1']).'",
              "'.mysql_escape_string($_POST['f_2']).'",
              )';

              mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());

              Encore une question pour fermer ma requete je dois utiliser
              exit();

              ou
              mysql_close();

              Merci beaucoup de ton aide
              1. Remplace tes mysql_escape_string() par mysql_real_escape_string()
            2. Pour se protéger, toute les données envoyés par l'utilisateur doivent être passées par mysql_escape_string(), et intval() si c'est des données numériques.
              1. mysql_escape_string(): Cette fonction est OBSOLETE depuis PHP 5.3.0. Nous vous encourageons vivement à ne plus l'utiliser.
                A remplacer donc par mysql_real_escape_string()
            3. Merci de votre reponse je viens de la changer et ca fonctionne

              Par contre je suis entrain de modifier mes autres formules et la ca coince

              actuel
              $requete1 = mysql_query("SELECT * FROM $table_name WHERE serie='$serie' ORDER BY $table_col ASC LIMIT ".$limite1.", ".$limite2."") or die(mysql_error());

              modification
              $requete1 = mysql_query("SELECT * FROM $table_name WHERE serie="'.mysql_real_escape_string('serie').'" ORDER BY $table_col ASC LIMIT ".$limite1.", ".$limite2."") or die(mysql_error());

              Par contre pour cette question vous ne m avez pas donne de reponse

              ncore une question pour fermer ma requete je dois utiliser
              exit();

              ou
              mysql_close();

              Merci de votre aide
              1. actuel
                $requete1 = mysql_query("SELECT * FROM $table_name WHERE serie='$serie' ORDER BY $table_col ASC LIMIT ".$limite1.", ".$limite2."") or die(mysql_error());


                modification
                $requete1 = mysql_query("SELECT * FROM $table_name WHERE serie="'.mysql_real_escape_string('serie').'" ORDER BY $table_col ASC LIMIT ".$limite1.", ".$limite2."") or die(mysql_error()); 


                Dans le premier cas tu utilises une variable ($serie) et pas dans le deuxième...
                Je dirai que c'est donc à modifier en:
                $requete1 = mysql_query("SELECT * FROM $table_name WHERE serie="'.mysql_real_escape_string($serie).'" ORDER BY $table_col ASC LIMIT ".$limite1.", ".$limite2."") or die(mysql_error()); 
            4. merci de ta reponse mais j avais aussi essaier

              voici l erreur

              Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in

              Merci
              1. Après le in tu as le numéro de ligne.
                Quelle est la ligne correspondante?

                Si c'est celle avec la requête, je t'invite à la réécrire de la manière suivante:
                $requete1 = mysql_query('SELECT * FROM '.$table_name.' WHERE serie="'.mysql_real_escape_string($serie).'" ORDER BY '.$table_col.' ASC LIMIT '.$limite1.', '.$limite2.'') or die(mysql_error());
            5. merci de ta reponse effectivement maintenant ca fonctionne

              La nouvel ecriture que tu m as donner correspond a quoi php5?

              Pour la fermeture de la base de donne le mieu est exit() ou mysql_close();

              Merci pour ton aide
              1. Mon ecriture est simplement une autre manière d'écrire.
                On peu écrire par exemple:
                echo 'ok';

                ou
                echo "ok";


                Pour fermer la connexion il faut utiliser mysql_close();
                exit();
                va simplement arrêter un script.
                Exemple:
                echo 'start';
                exit();
                echo 'end';

                "end" ne sera pas écrit.
            6. Merci de ton aide

              JE vais modifier toutes mes pages et je te tiens au courant

              Merci pour tous
              1. Pas de souci, c'est toujours un plaisir d'aider.
            7. Voila je veins de modifier tous mes fichier j ai refait le test avec havij et je n est plus acces a ma base de donné niquel merci

              Maintenant j aimerais savoir si mon site est sur et si tu connais d autre logiciel d injection sql pour tester tous cela

              Merci de ton aide