Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SQL] parametre requete via variable

    1 novembre 2014 à 1:54:16

    J'ai besoin de votre aide, car apprès plusieurs recherche, je ne sais toujours pas pourquoi ce code ne marche pas : 

    voilà l'url du lien qui envoie vers ma page apprendre.php  ( href="DC/apprendre.php?categorie=danse" )

    apprendre.php 

    <!DOCTYPE html>
    <html>
    	
    	  <?php include("includes/entete.php"); ?>
    	  
    	
    	<body>
    		
    		<?php include("includes/menu.php"); ?>
    		
    	    <?php
    		try
    		{
    			// On se connecte à MySQL
    			$bdd = new PDO('mysql:host=localhost;dbname=base', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    		}
    		catch(Exception $e)
    		{
    			// En cas d'erreur, on affiche un message et on arrête tout
    				die('Erreur : '.$e->getMessage());
    		}
    
    		// Si tout va bien, on peut continuer
    
    		// On récupère tout le contenu de la table jeux_video
            
    		$param = ' ';
    		$get = ' ';
    		
    		
    		$get = strip_tags($_GET['categorie']);
    		
    		$param = 'categorie = ' . $get . ' ';
    		
    		
    		
    		
    		
    		
    		if(isset($_GET['style']))
    		{
    		$ad = $param;
    		$param = $ad . 'AND ';
    		$ad = $param;
    		
    		$get = strip_tags($_GET['style']);
    		
    		$param = $ad . 'style = '. $get .' ';
    		
    		}
    		
    		if(isset($_GET['style-precision']))
    		{
    		$ad = $param;
    		$param = $ad . ' AND ';
    		$ad = $param;
    		
    		$get = strip_tags($_GET['style-precision']);
    		
    		$param = $ad . 'style-precision = '. $get .' ';
    		
    		}
    		
    		echo '<section><p>';
    		echo $param;
    		echo '</p></section>';
    		
    	     $req = $bdd->query('SELECT * FROM danse WHERE   '. $param .'  ORDER BY  niveau ');
    		
    		
    		
    
    
    		// On affiche chaque entrée une à une
    		while ($donnees = $req->fetch())
    		{
    		?>
    		
    		<aside class="adaptable">	
    			<section>
    			<div class="video"><iframe  src="<?php echo $donnees['lien']; ?>" frameborder="0" allowfullscreen></iframe></div>
    			<h2><?php echo $donnees['titre']; ?></h2>
    			<p> vidéo de niveau <?php echo $donnees['niveau']; ?> publier le <?php echo $donnees['date']; ?>  par <?php echo $donnees['auteur']; ?></p>
    		
    			<?php include("includes/commentaires.php"); ?>
    			
    			</section>
    			
    		</aside>
    		
    		<?php
    		}
    
    		$req->closeCursor(); // Termine le traitement de la requête
    
    		?>
    		
    	</body>
    	
    </html>

    voilà ce qui s'affiche 

    Le problème se situe au niveau de la requète sql , merci de votre attention o_O

    -
    Edité par BlackFace12 1 novembre 2014 à 1:56:27

    • Partager sur Facebook
    • Partager sur Twitter
      1 novembre 2014 à 11:23:03

      Ca ne va pas du tout : ton strip_tags te protège partiellement des XSS quand c'est des injections SQL dont tu devrais te protéger (en clair ce serait injections land là).

      Remplaces avant tout tous tes ' . $get . ' par ' . $bdd->quote($get) . '.

      Vires tes strip_tags. Et sur style-precision vu que ce n'est pas un identifiant SQL valide (pas de tiret !), soit tu renommes ta colonne soit tu écris partout `style-precision`. Si vraiment tu voulais te protéger des XSS, c'est des htmlspecialchars qu'on devrait trouver sur les echo [des valeurs tirées de la bdd] dans le while.

      Pour simplifier et ne pas avoir à gérer le AND, tu pouvais passer par un tableau (exemple).

      -
      Edité par julp 1 novembre 2014 à 11:29:19

      • Partager sur Facebook
      • Partager sur Twitter
        1 novembre 2014 à 11:51:54

        ça se voit tant que ça que je suis debutant ^_^ j'ai commencé il y a 2s emaine donc j'ai pas encore tout assimilé mais merci des conseils et des liens, je vais essayer d'arranger ça ^_^ 

        • Partager sur Facebook
        • Partager sur Twitter
          1 novembre 2014 à 11:58:26

          J'ai réecrit le code et tout marche niquel ^_^Encore merci de votre aide :magicien:

          j'aimerais juste avoir votre avis pour savoir si mon code protège des injections SQL à présent ? merci encore ^^

          <?php session_start();?>
          <!DOCTYPE html>
          <html>
          	
          	  <?php include("includes/entete.php"); ?>
          	  
          	
          	<body>
          		
          		<?php include("includes/menu.php"); ?>
          		
          	    <?php
          		try
          		{
          			// On se connecte à MySQL
          			$bdd = new PDO('mysql:host=localhost;dbname=base', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
          		}
          		catch(Exception $e)
          		{
          			// En cas d'erreur, on affiche un message et on arrête tout
          				die('Erreur : '.$e->getMessage());
          		}
          
          		// Si tout va bien, on peut continuer
          
          		// On récupère tout le contenu de la table jeux_video
                  
          		$param = ' ';
          		$get = ' ';
          		
          		
          		$get = htmlspecialchars($_GET['categorie']);
          		
          		$param = 'categorie = '  . $bdd->quote($get) . ' ';
          		
          		
          		
          		
          		
          		
          		if(isset($_GET['style']))
          		{
          		$ad = $param;
          		$param = $ad . 'AND ';
          		$ad = $param;
          		
          		$get = htmlspecialchars($_GET['style']);
          		
          		$param = $ad . 'style = ' . $bdd->quote($get) . ' ';
          		
          		}
          		
          		if(isset($_GET['style-precision']))
          		{
          		$ad = $param;
          		$param = $ad . ' AND ';
          		$ad = $param;
          		
          		$get = htmlspecialchars($_GET['style-precision']);
          		
          		$param = $ad . 'style-precision = ' . $bdd->quote($get) . ' ';
          		
          		}
          		
          		$ad = 'SELECT * FROM danse WHERE ' . $param . 'ORDER BY  niveau';
          		$param = $ad;
          		
          		echo '<section><p>';
          		echo $param;
          		echo '</p></section>';
          		
          	     $req = $bdd->query($param);
          		
          		
          		
          
          
          		// On affiche chaque entrée une à une
          		while ($donnees = $req->fetch())
          		{
          		?>
          		
          		<aside class="adaptable">	
          			<section>
          			<div class="video"><iframe  src="<?php echo $donnees['lien']; ?>" frameborder="0" allowfullscreen></iframe></div>
          			<h2><?php echo $donnees['titre']; ?></h2>
          			<p> vidéo de niveau <?php echo $donnees['niveau']; ?> publier le <?php echo $donnees['date']; ?>  par <?php echo $donnees['auteur']; ?></p>
          		
          			<?php include("includes/commentaires.php"); ?>
          			
          			</section>
          			
          		</aside>
          		
          		<?php
          		}
          
          		$req->closeCursor(); // Termine le traitement de la requête
          
          		?>
          		
          	</body>
          	
          </html>



          • Partager sur Facebook
          • Partager sur Twitter
            1 novembre 2014 à 13:15:52

            Oui, en même temps je t'avais donné la correction ... Par contre, tu n'as pas compris le reste :

            • tu n'as pas corrigé l'invalidité de ton identifiant SQL = requête qui plante à coup sûr quand isset($_GET['style-precision']) est vrai
            • tu n'as toujours pas compris ce qu'est une XSS : je te répète qu'elles sont à prendre en compte à l'affichage (echo & co), ça n'a rien à voir avec les requêtes SQL (google it) => tes htmlspecialchars sont au mauvais endroit (autrement dit, ils ne servent à rien)

            Ca aurait été bien quand même de vérifier que isset($_GET['categorie']) est vrai avant de chercher à l'utiliser.

            -
            Edité par julp 1 novembre 2014 à 13:20:54

            • Partager sur Facebook
            • Partager sur Twitter

            [SQL] parametre requete via variable

            × 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