Partage
  • Partager sur Facebook
  • Partager sur Twitter

La suite de ma requête est ignoré

    25 septembre 2021 à 20:42:54

    $query = $db->prepare("SELECT * FROM members WHERE id=? OR id=2");
    $query->execute([$memberID]);
    return $query;

    Bonjour ,

    Je met manuellement la valeur "1" au paramètre id de ma page mais bizarrement ça ne renvoie jamais le membre dont l'id est égal à deux

    Merci pour votre aide et merci encore à la communauté de perdurer sur le web.

    • Partager sur Facebook
    • Partager sur Twitter
      25 septembre 2021 à 20:50:42

      Bonsoir,

      tant que le 1er paramètre sera trouvé, il ne renverra jamais le second, ce qui est logique

      -
      Edité par Aurélien10! 25 septembre 2021 à 21:18:02

      • Partager sur Facebook
      • Partager sur Twitter
        25 septembre 2021 à 20:57:52

        A moins de limiter le nombre de lignes (LIMIT), tant qu'il en existe 2 (une avec id = 1 et l'autre avec id = 2 - supposant qu'id ait une contrainte unique), il devrait obtenir 2 lignes.

        Parce que tu ne fais qu'un seul fetch ? La vraie requête a un LIMIT 1 ? L'id 2 n'existe pas ?

        Suite du code ? Quel contenu en base ?

        Tu obtiens quoi ? Quand tu veux quoi ?

        -
        Edité par julp 25 septembre 2021 à 22:37:36

        • Partager sur Facebook
        • Partager sur Twitter
          26 septembre 2021 à 13:37:36

          Aurélien10! a écrit:

          Bonsoir,

          tant que le 1er paramètre sera trouvé, il ne renverra jamais le second, ce qui est logique

          -
          Edité par Aurélien10! il y a environ 16 heures


          Merci Aurélien.

          En fait ce que j'essaie de faire c'est de provoquer une faille pour que je comprenne mieux les notions de sécurité web

          C'est possible que en paramètre (dans l'url) je puisse mettre "?id=1 OR id = 2" en ayant préalablement effacer le membre 1 et que la requête fonctionne ?

          -
          Edité par MouMouDu67 26 septembre 2021 à 13:37:57

          • Partager sur Facebook
          • Partager sur Twitter
            26 septembre 2021 à 13:40:55

            > ce que j'essaie de faire c'est de provoquer une faille

            C'est impossible avec une requête préparée (enfin, un paramètre de requête préparée), c'est justement un de leurs buts : tu ne peux pas binder un fragment SQL, il sera pris pour une vulgaire chaîne de caractères.

            Mais :

            1. tu aurais pu le préciser dès le départ
            2. je ne comprends pas comment tu voulais le faire avec ta requête de départ (le "OR id = 2" étant hardcodé, il ne vient pas de l'utilisateur)
            3. pas sûr de comprendre que "en ayant préalablement effacer le membre 1" change quelque chose à moins que l'on parte du principe que la requête ne soit censée retourner qu'une ligne (= tu ne fais qu'un fetch/ne considères que la première ligne) - point que ton code ne montre pas étant incomplet comme je l'ai déjà dit

            Le vrai code (complet) ? La vraie intention ? Histoire que l'on sache réellement ce que tu cherches à faire et comment pour que l'on puisse y répondre de manière pertinente. Là, honnêtement, s'il faut deviner plus de moitié des choses, ça relève plus de la perte de temps pour tout le monde qu'autre chose.

            -
            Edité par julp 26 septembre 2021 à 13:49:52

            • Partager sur Facebook
            • Partager sur Twitter
              26 septembre 2021 à 14:07:36

              Merci Julp de ta réponse, je n'ai pas compris le terme binder ; je crois que je dois réviser les bases ....

              voici le code sur la vue

              <?php 
              if(!empty($_SESSION['id'])){
              
              
              $membre_id = $_GET['id'];
              $req = getMembersInformations($membre_id);
              $data = $req->fetch();
              $title = 'Profil de '.$data['username']; 
              ?>
              
              <?php 
              ob_start();
              ?>
              
              <div class="col-lg-12  text-center">
              <h1 class="text-center"><?= $data['username']  ?></h1>
              
              <?php
              
              if($data['statut_mail'] == 1){
                   echo $data['mail'];
              }
              else
              {
                  echo $data['username']." n'a pas rendu son mail publique";
              }
              
              
              
              ?>
              </div>
              
              
              </div>
              <?php $content = ob_get_clean(); ?>
              <?php ob_start();   ?>
              <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
              <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
              <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
              <script type="text/javascript" src="public/js/form.js"></script>
              <?php $fichiers = ob_get_clean(); ?>
              <?php require('view/frontend/template.php'); }?>


              donc vous pourrez comprendre avec ce bout de code (à la ligne 7-8) que la requête doit retourner une seule ligne. (C'est ce que je veux)

              Voici l'url d'entrée "http://127.0.0.1:8080/site/?page=memberProfil&id=5 OR id=1"

              L'id 5 n'existe pas dans ma base de donnée ; c'est fait intentionnellement.

              C'est donc censé me renvoyé l'utilisateur dont l'id est 1, l'id 5 n'étant pas existant.

              ma requête est transformé en ça "http://127.0.0.1:8080/site/?page=memberProfil&id=5%20OR%20id%20=%201"

              Je me demande maintenant : Pourquoi ça ne passe pas ?

              function getMembersInformations($memberID){
                  $db = dbConnect();
                  $query = $db->prepare("SELECT * FROM members WHERE id=?");
                  $query->execute([$memberID]);
                  return $query;
              }



              • Partager sur Facebook
              • Partager sur Twitter
                26 septembre 2021 à 17:13:35

                Je te l'ai dit : c'est impossible avec une requête préparée, ce qui est substitué par des marqueurs ne sont que des valeurs, pas du SQL (même partiel). C'est comme si ça finissait en SELECT * FROM members WHERE id = '5 OR id = 1' (noter les quotes), pas en SELECT * FROM members WHERE id = 5 OR id = 1 et avec MySQL, comme ta colonne est de type *INT, ça finit même interprété en SELECT * FROM members WHERE id = 5 car il caste comme PHP en s'arrêtant au premier non chiffre trouvé.

                Si tu veux vraiment tester une injection SQL, il faut que tu injectes ta valeur ($memberID) directement dans la chaîne de requêtes (par concaténation ou interpolation).

                Ce sont les but et raison des requêtes préparées : séparer/externaliser les données de la requête pour qu'une injection SQL soit impossible. Auparavant, en non-préparé, on injectait directement les valeurs dans la requête au risque justement que celles-ci modifient le sens de la requête si elles n'étaient pas correctement échappées/castées, en résultant alors une injection SQL.

                -
                Edité par julp 26 septembre 2021 à 17:23:00

                • Partager sur Facebook
                • Partager sur Twitter
                  1 octobre 2021 à 18:55:05

                  Merci beaucoup pour ces précisions Julp :D . J'ai compris maintenant mais faut que je parte approfondir ces choses là maintenant.

                  -
                  Edité par MouMouDu67 1 octobre 2021 à 19:00:29

                  • Partager sur Facebook
                  • Partager sur Twitter

                  La suite de ma requête est ignoré

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown