Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
800 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

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

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2334810
Buandflu
Posté le 07-06-2019 à 11:46:46  profilanswer
 

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

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

mood
Publicité
Posté le 07-06-2019 à 11:46:46  profilanswer
 

n°2334816
B4X
kebab-case
Posté le 07-06-2019 à 12:56:09  profilanswer
 

Parce que ta condition if(isset($_POST['animation'])) est toujours vraie.
Par ailleurs, ton code est vulnérable aux injections SQL.


---------------
In vanitas veritas.
n°2334843
Buandflu
Posté le 07-06-2019 à 17:33:51  profilanswer
 

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 ?


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

n°2334845
rat de com​bat
attention rongeur méchant!
Posté le 07-06-2019 à 18:09:20  profilanswer
 

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
n°2334848
MaybeEijOr​Not
but someone at least
Posté le 07-06-2019 à 19:15:01  profilanswer
 

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.
n°2334875
B4X
kebab-case
Posté le 08-06-2019 à 18:21:02  profilanswer
 

Buandflu a écrit :

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 ?


Non.
 


<form method="POST" action="https://le-site-a-buandflu.fr/page.php">
<input type="text" name="animation" value="1'; DROP TABLE vid; --" />
<input type="submit" />
</form>


---------------
In vanitas veritas.
n°2334878
Buandflu
Posté le 09-06-2019 à 18:51:41  profilanswer
 

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

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

n°2334879
Buandflu
Posté le 09-06-2019 à 18:52:42  profilanswer
 

B4X a écrit :


Non.
 


<form method="POST" action="https://le-site-a-buandflu.fr/page.php">
<input type="text" name="animation" value="1'; DROP TABLE vid; --" />
<input type="submit" />
</form>



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


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

n°2334880
Buandflu
Posté le 09-06-2019 à 19:59:50  profilanswer
 

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 ?


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

n°2334881
B4X
kebab-case
Posté le 09-06-2019 à 20:34:42  profilanswer
 

[:dks:4]  
 
Maintenant tu peux optimiser. En règle général, chaque fois que tu constate un motif qui se répète dans ton code, c'est qu'il y a matière à optimiser. En l'occurrence, tu peux déplacer tes execute() et tes echo() quelque part en bas, pour ne l'avoir qu'une seule fois au lieu de 3 fois ici.


---------------
In vanitas veritas.
mood
Publicité
Posté le 09-06-2019 à 20:34:42  profilanswer
 

n°2334885
Buandflu
Posté le 10-06-2019 à 11:40:55  profilanswer
 

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

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

n°2334888
rat de com​bat
attention rongeur méchant!
Posté le 10-06-2019 à 14:03:18  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

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

 

Sujets relatifs
Erreur code Formulaire de saisie excelProblème de caractères spéciaux tkinter et fichier texte (Resolu)
Problème inclusion librairie arduino[Python]Problème de split.
Problème pour créer une plateforme de conversion de monnaie avec vbaProblème requête GET serveurWeb/Microcontroleur
petit probleme avec grepCréation d'un "select" personnalisé
[VB/VBA/VBS] Problème script pour exécuter des programmesProblème de map sur un array
Plus de sujets relatifs à : [RÉSOLU]Problème de traitement d'un formulaire


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR