[RÉSOLU]Problème de traitement d'un formulaire

Problème de traitement d'un formulaire [RÉSOLU] - PHP - Programmation

Marsh Posté le 07-06-2019 à 11:46:46    

Bonjour !
 
Je suis en train de devenir fou avec mon site... J'essaye de supprimer des éléments dans ma base de données depuis un backoffice que je suis en train de coder.
Voici mon html :

Code :
  1. <form action = "delete.php" method = "POST">
  2.     <div>Film :
  3.         <select id="film" name = "film">
  4.             <option value ="default">choisir le film à supprimer</option>
  5.             <?= getFilm() ?>
  6.         </select>
  7.     </div>
  8.     <div>Animation :
  9.         <select id="animation" name = "animation">
  10.             <option value ="default">choisir le dessin-animé à supprimer</option>
  11.             <?= getAnimation() ?>
  12.         </select>
  13.     </div>
  14.     <div>Série :
  15.         <select id="serie" name = "serie">
  16.             <option value ="default">choisir la série à supprimer</option>
  17.             <?= getSerie() ?>
  18.         </select>
  19.     </div>
  20.     <input type = 'submit' id = 'delete' name = 'delete' value = 'Supprimer' onclick = 'window.location.reload(true)'>
  21. </form>


 
Voici mon php :

Code :
  1. if (isset($_POST["delete"])) {
  2.     $pdo = dbconnect();
  3.     if ((isset($_POST['animation'])) or ( isset($_POST['serie']))) {
  4.         if (isset($_POST['animation']))
  5.             $id = $_POST['animation'];
  6.         else
  7.             $id = $_POST['serie'];
  8.         $sql = "delete from vid where id='$id'";
  9.         if ($pdo->exec($sql))
  10.             echo "Élement correctement supprimé de la base de données.";
  11.         else
  12.             echo "Il y a un problème";
  13.         $pdo = null;
  14.     }
  15. } else {
  16.     $id = $_POST['film'];
  17.     $sql = "delete from film where id='$id'";
  18.     if ($pdo->exec($sql))
  19.         echo "Élement correctement supprimé de la base de données.";
  20.     else
  21.         echo "Il y a un problème";
  22.     $pdo = null;
  23. }


 
Quelque chose ne tourne pas rond, mais je n'arrive pas à voir quoi. Le code peut supprimer seulement une animation. Le reste il n'y arrive pas...
 
Est-ce que quelqu'un pourrait me dépanner ?
Un grand merci d'avance !


Message édité par Buandflu le 10-06-2019 à 11:48:30

---------------

Reply

Marsh Posté le 07-06-2019 à 11:46:46   

Reply

Marsh Posté le 07-06-2019 à 17:33:51    

Merci B4X pour ta réponse ! J'avais pas pensé à ça...
Je regarde ce soir pour corriger ça
 
Quand tu dis que mon code est vulnérable aux injections sql, comme c'est pas des input text, mais des selects (en gros le navigateur peut rien taper au clavier) c'est ok non ?


---------------

Reply

Marsh Posté le 07-06-2019 à 18:09:20    

Buandflu a écrit :

Quand tu dis que mon code est vulnérable aux injections sql, comme c'est pas des input text, mais des selects (en gros le navigateur peut rien taper au clavier) c'est ok non ?

Ah ben non, ça prend 3 lignes de script pour créer une requête qui va fou... en l'air ta base de données. Il faut TOUJOURS nettoyer ses données entrantes.
edit: Même aucune ligne de code avec les outils intégrés à Firefox!


Message édité par rat de combat le 07-06-2019 à 18:09:54
Reply

Marsh Posté le 07-06-2019 à 19:15:01    

Pour faire de l'injection SQL on n'utilise pas ta page HTML, on envoie directement une requête POST à ton fichier.php, à partir de là tu écries ce que tu veux dans ta requête POST afin de réécrire la requête SQL.
Néanmoins je vais mesurer les propos apportés, normalement, ton fichier n'est accessible que sur identification puisqu'il fait parti du backoffice, ce qui doit limiter les risques. Normalement le risque est présent si tu as différents niveaux d'autorisation dans le backoffice, à ce moment là, un utilisateur avec des droits faibles pourrait outrepasser ses autorisations avec une injection SQL.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 09-06-2019 à 18:51:41    

MaybeEijOrNot a écrit :

Néanmoins je vais mesurer les propos apportés, normalement, ton fichier n'est accessible que sur identification puisqu'il fait parti du backoffice, ce qui doit limiter les risques. Normalement le risque est présent si tu as différents niveaux d'autorisation dans le backoffice, à ce moment là, un utilisateur avec des droits faibles pourrait outrepasser ses autorisations avec une injection SQL.

 

Oui il faut bien sûr être connecté pour arriver sur delete.php.


Message édité par Buandflu le 09-06-2019 à 19:06:54

---------------

Reply

Marsh Posté le 09-06-2019 à 18:52:42    


 
Effectivement. Du coup, comment on évite les injections ?


---------------

Reply

Marsh Posté le 09-06-2019 à 19:59:50    

Buandflu a écrit :


 
Effectivement. Du coup, comment on évite les injections ?


 
Comme google lilo est mon ami, du coup j'ai mis des prepare statement (je sais pas comment on dit en Français). Ça donne ça :
 

Code :
  1. if (isset($_POST["delete"])) {
  2.     $pdo = dbconnect();
  3.     if (!empty($_POST['animation'])) {
  4.         $sql = "delete from vid where id= :filmID";
  5.         $stmt = $pdo->prepare($sql);
  6.         $stmt->bindParam(':filmID', $_POST['animation'], PDO::PARAM_INT);
  7.         if ($stmt->execute())
  8.             echo "Élement correctement supprimé de la base de données.";
  9.         else
  10.             echo "Il y a un problème";
  11.     }elseif (!empty($_POST['film'])) {
  12.         $sql = "delete from vid where id= :filmID";
  13.         $stmt = $pdo->prepare($sql);
  14.         $stmt->bindParam(':filmID', $_POST['film'], PDO::PARAM_INT);
  15.         if ($stmt->execute())
  16.             echo "Élement correctement supprimé de la base de données.";
  17.         else
  18.             echo "Il y a un problème";
  19.     }elseif (!empty($_POST['serie'])) {
  20.         $sql = "delete from vid where id= :filmID";
  21.         $stmt = $pdo->prepare($sql);
  22.         $stmt->bindParam(':filmID', $_POST['serie'], PDO::PARAM_INT);
  23.         if ($stmt->execute())
  24.             echo "Élement correctement supprimé de la base de données.";
  25.         else
  26.             echo "Il y a un problème";
  27.         $pdo = null;
  28.     }
  29. }


 
Ça marche bien. Vous voyez d'autre trucs pour éviter les injections les plus communes ?


---------------

Reply

Marsh Posté le 10-06-2019 à 11:40:55    

Pas fou ça ! Merci B4X :)
J'ai une question qui me vient à l'esprit concernant les injections. Quelque chose comme ça est-il sûr ?
$stmt = $pdo->query("requête sql" )
J'arrive pas à trouver de réponse claire sur google lilo...


Message édité par Buandflu le 10-06-2019 à 11:43:53

---------------

Reply

Marsh Posté le 10-06-2019 à 14:03:18    

Une injection SQL n'est possible que quand on passe une variable non "nettoyée" dans une rêquete SQL. Si tu passes par le PDO normalement c'est bon, idem si tu fais une rêquete sans paramètres. Sans garantie, je ne parle pas PHP ni SQL. :o

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed