d3:tp04:suite

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
d3:tp04:suite [2025/09/25 22:44] – créée dthevenotd3:tp04:suite [2025/09/28 19:10] (Version actuelle) – [V. Attention : injection SQL, faille XSS (Cross-Site Scripting) en vue…] dthevenot
Ligne 1: Ligne 1:
-====== D3-TP04-suite : Persistance des données (2) ======+====== D3-TP04-suite : Projet gestion de clients - Persistance des données (2) ======
 ===== Contexte ===== ===== Contexte =====
 Nous poursuivons notre application permettant de gestion des clients d'une entreprise de travaux  publics. Cette application doit permettre :  Nous poursuivons notre application permettant de gestion des clients d'une entreprise de travaux  publics. Cette application doit permettre : 
Ligne 8: Ligne 8:
 Le travail commencé a permis de gérer approximativement l'authentification, l'affichage d'un  menu et l'affichage de la liste des clients.  Le travail commencé a permis de gérer approximativement l'authentification, l'affichage d'un  menu et l'affichage de la liste des clients. 
 ===== Travail à faire ===== ===== Travail à faire =====
-Désormais, il faudrait pouvoir permettre la **saisie d'un nouveau clien**t et enregistrer les données saisies  dans la base de données bdclient. +Désormais, il faudrait pouvoir permettre la **saisie d'un nouveau clien**t et enregistrer les données saisies  dans la base de données **bdclient**.  
 + 
 +==== I. Création du formulaire de saisie  ==== 
 +  
 +Modifier la page **nouveauClientVue.jsp** en y insérant un formulaire qui devra permettre de saisir toutes les  données de la table client (Sauf l'id qui s'incrémente automatiquement). Ce formulaire lancera la  méthode **doPost** de la servlet **NouveauServlet.java** en cas de soumission. Une fois la création du client  terminée, un message indique à l'utilisateur : //le client no ….. a été créé avec succès//  
 +==== II. Modification de la classe ClientMysql ==== 
 +Cette classe est dédiée aux requêtes SQL concernant la table client.   
 + 
 +La méthode readAll est déjà écrite, il faut désormais ajouter la méthode **create(Client unClient)**.  
 + 
 +__Rappel :__ Les requêtes SQL ont besoin d'un objet de type **Statement** qui contiendra la requête SQL. La  méthode **executeUpdate** appliquée à cet objet exécute la requête. Cette méthode retourne le nombre de  lignes affectées par la requête. Les accès à la base de données sont des instructions "à risque", c'est  pourquoi elles seront encadrées par try { …}.  
 + 
 +La méthode **getGeneratedKeys** permet de récupérer l'identifiant du client créé.  
 + 
 +Exemple de méthode **create** pour l'ajout d'une occurrence dans une table Salarie (avec requête préparée): 
 +<code ruby ClientMysql.java> 
 +public int create(Client unClient){ 
 +         int id=-1; 
 +         String sql = "INSERT INTO client (nom, prenom, mail) VALUES (?,?,?);"; 
 +          
 +         try (PreparedStatement prepStmt = theConnection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { 
 +             
 +            prepStmt.setString(1, unClient.getNom());//le param. 1 est remplacé par le nom du client 
 +            prepStmt.setString(2, unClient.getPrenom()); 
 +            prepStmt.setString(3, unClient.getMail()); 
 +              
 +            int status = prepStmt.executeUpdate(); 
 +             // récupération de la clé auto-générée 
 +            if (status > 0) { 
 +                try (ResultSet result = prepStmt.getGeneratedKeys()) { 
 +                    if (result.next()) {  // <-- utiliser next() et pas first() 
 +                        id = result.getInt(1); 
 +                    } 
 +                 } 
 +            } 
 +            prepStmt.close(); 
 +             
 +         } catch(SQLException ex){ 
 +            System.out.println("SQLException:"+ex.getMessage()); 
 +            System.out.println("SQLState:"+ex.getSQLState()); 
 +            System.out.println("code Erreur:"+ex.getErrorCode()); 
 +        } 
 +         return id; 
 +     } 
 +
 +</code> 
 +==== III. Créer la classe NouveauClientForm dans le package com.test.forms ==== 
 +   
 +Cette classe contrôlera les saisies effectuées, puis permettra la création du client (Cf exemple AuthentifForm.java)  
 + 
 +Ajouter la méthode **verifierClient(HttpServletRequest request)** :  
 +  * Avec les données récupérées, créer un nouveau client.  
 +  * Créer une instance de ClientMySQL  
 +  * Appeler la méthode create en lui passant le nouveau client créé  
 +  * Tester le retour de cette méthode et adapter le message dans resultat  
 +  * Tester la création, vérifier l'ajout de l'enregistrement dans la table client  
 +==== IV. Modifier la méthode doPost de la servlet NouveauServlet.java  ==== 
 +  
 +Cette méthode est exécutée après validation du formulaire de saisie d'un nouveau client. Elle devra  instancier un objet de type **NouveauClientForm**, et appeler la méthode **verifierClient**. Si l'ajout s'est bien  passé, la page de liste des clients s'affichera avec un message indiquant "//L'ajout du client xxx s'est bien  déroulé//". Sinon, la page de saisie du formulaire se réaffichera avec un message d'erreur. 
 + 
 +==== V. Attention : injection SQL, faille XSS (Cross-Site Scripting) en vue…  ==== 
 +  
 +Vous avez maintenant 2 formulaires dans votre application, testez -les en écrivant dans une zone de texte : <code><script>alert("Coucou!");</script> </code> 
 + 
 +  - Que remarquez-vous ? Pourquoi ? 
 +  - Vérifier ce qui est sauvegardé dans la base de données.  
 +  - En quoi cela est-il dangereux ?  
 +Pour résoudre ce problème, de type faille xss, il faudra tester les zones saisies, elles ne devront pas  comporter le caractère "<"
 +  * Utiliser une expression régulière et la méthode matches pour vérifier qu'il n'y a que des caractères 
 + 
 +Tester
  
  
  • d3/tp04/suite.1758833092.txt.gz
  • Dernière modification : 2025/09/25 22:44
  • de dthevenot