Rechercher dans une base de donnée

Petit nouveau ! | 1 Messages

12 sept. 2019, 17:16

Voila mon probleme, je peux chercher et afficher ma base de donnée avec ce code, sauf que l'on me dit que c'est pas bien du tout de faire avec htmlspecialchars. Sauf que j'ai essayer d'autres choses et je n'arrive pas à afficher et rechercher dans ma base de donnée sans passer par ce code .
<?php

$bdd = new PDO('mysql:host=localhost;dbname=;charset=utf8','','');

$dossiers = $bdd->query('SELECT * FROM dossiers ORDER BY ID ');
if(isset($_GET['q']) AND !empty($_GET['q'])) {
   $q = htmlspecialchars($_GET['q']);
   $dossiers = $bdd->query('SELECT * FROM dossiers WHERE Langue  LIKE "%'.$q.'%" ORDER BY id '); 
   if($dossiers->rowCount() == 0) {
      $dossiers = $bdd->query('SELECT * FROM dossiers WHERE CONCAT(Langue, Modèles, Type, Nom, Lien) LIKE "%'.$q.'%" ORDER BY id ');
   }
}
?>
<div class="container">

</form><form method="GET">
   <input type="search" name="q" placeholder="Recherche..." style="width: 300px; height: 40px;"/>
   <input type="submit" value="Valider" style="width: 75px; height: 40px;" />
<?php if($dossiers->rowCount() > 0) { ?>
<table class="table table-striped " >
      <tr>
         <th >ID</th>
         <th >Langues</th>
         <th >Modèles </th>
         <th >Type </th>
        <th >Nom</th>
     <th >Lien</th>
          </tr>
           </thead>
   <?php while($a = $dossiers->fetch()) { ?>
      <tr >
        <td><?= $a['ID'] ?></td>
      <td><?= $a['Langue'] ?></td>
       <td><?= $a['Modèles'] ?></td>
       <td><?= $a['Type'] ?></td>
              <td><?= $a['Nom'] ?></td>       
                <td><?php echo ('<p><a href="'.$a['Lien'].'"target="_blank">'.$a['Lien'].' </a>'); ?> </td>

          <tr>

   <?php } ?>
   </ul>
<?php } else { ?>
Aucun résultat pour: <?= $q ?>...<br >Veuillez retenter une recherche ou retourner à <a href=""> la liste des données.</a>
<?php } ?>

Mammouth du PHP | 991 Messages

12 sept. 2019, 23:16

le soucis est que tu es largement ouvert à l'injection SQL, imagine que je passe à ton URL : ?q=LIMIT 1; SELECT * FROM maSuperTable;

Je te conseil de regarder du coder des requêtes préparés afin d'évite ce futur soucis.
DevOps, Symfony4, Hoa

Mammouth du PHP | 1168 Messages

12 sept. 2019, 23:47

ça donnerait :
SELECT * FROM dossiers WHERE Langue LIKE "%LIMIT 1; SELECT * FROM maSuperTable;%" ORDER BY id
pas d'injection.

si on met un " dans le q passé, le " est transformé en &quot; par htmlspecialchars, pas d'injection non plus.

ce qui n’empêche pas de suivre le conseil de mettre des requêtes préparées.

Petit nouveau ! | 2 Messages

13 sept. 2019, 16:07

les requêtes préparés sont un moyen de sécurisé encore ton code pas de variable directement dans la requête

Code : Tout sélectionner

$red = $bdd->prepare('SELECT DATE_FORMAT(rdv_livreur, "%H:%i") AS heure_rdv_livreur FROM client WHERE rdv_livreur LIKE ?'); $red->execute(array($debut_rdv."%")); // ICI TA VARIABLE while ($donnees = $red->fetch()) { }$red->closeCursor();