IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Servlets/JSP Java Discussion :

Sécuriser et empêcher l'exécution d'une servlet par un visiteur


Sujet :

Servlets/JSP Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 16
    Points : 16
    Points
    16
    Par défaut Sécuriser et empêcher l'exécution d'une servlet par un visiteur
    Bonjour,

    J'ai une page jsp appelée "modificationDocument.jsp" qui possède un bouton suppression avec un lien dirigeant vers une servlet pour supprimer une donnée dans ma base de donnée.

    Mon bouton suppression:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <a href='supprimerDocument?id=233' ><button type='button' class='btn btn-default'>Supprimer</button></a>
    Ma servlet avec la méthode doGet() prend la valeur du parametre de id transmise dans l'URL, supprime la donnée et affiche une page de résultat.

    J'ai deux problèmes:

    J'aimerai quel seul un utilisateur authentifié puisse pouvoir exécuter la servlet avec URL "/supprimerDocument" . Actuellement un visiteur quelconque peut taper le lien URL vers la servlet et accéder comme il le désire sans avoir de restriction.
    J'ai pensé à une solution dans ma méthode doGet de chacune de mes servlets vérifier si la session a été crée si elle a été créer regarder si l'utilisateur existe dans ma base de donnée sinon rediriger vers la page d'accueil. Je ne sais pas si c'est la meilleur manière de procéder.

    Mon autre problème:
    Si l'utilisateur est bien authentifié, Existe t-il un moyen que l'utilisateur ne puisse exécuter "/supprimerDocument?id=233" uniquement à partir du bouton "Supprimer" dans ma page "modificationDocument.jsp".
    Je ne voudrais pas que l'utilisateur authentifié puisse taper "/supprimerDocument?id=32324" dans l'URL directement.


    Merci d'avance
    Si vous avez des pistes ou idées je suis preneur

  2. #2
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 320
    Points : 3 741
    Points
    3 741
    Billets dans le blog
    12
    Par défaut
    Bonsoir,


    La méthode GET sert à afficher une ressource, ici tu t'en sers pour supprimer quelque chose. Ce n'est pas la bonne méthode, si tu veux bien faire les choses, tu dois envoyer une requête HTTP avec la méthode DELETE. Cela signifie qu'au niveau de ta servlet, tu dois utiliser non pas doGet(), mais doDelete().

    Tu peux vérifier si l'utilisateur est authentifié à partir d'un filtre (cf: Filter). Si ton utilisateur est authentifié, tu dois vérifier dans ta base s'il a les permissions nécessaires pour supprimer ta ressource dont l'id est 233, si oui tu vas supprimer ta ressource et retourner un code 200 (ok), sinon tu dois retourner le code d'erreur 403 (non autorisé).


    A+
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  3. #3
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Personnellement, j'aurais utilisé la méthode doPost pour exécuter le traitement, du coup, la requête à partir de la barre d'adresse ne fonctionnera pas.
    Pour ce qui est de l'utilisateur authentifié, tout dépend du type d'authentification.
    Si tu as un système basé sur JAAS, tu peux savoir si la requête est liée à un utilisateur authentifié si request.getUserPrincipal() te renvoie quelque chose.
    Si c'est un système "maison", là, ça dépend de ce qui a été prévu... souvent un objet mis en session.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Gugelhupf Voir le message
    Bonsoir,


    La méthode GET sert à afficher une ressource, ici tu t'en sers pour supprimer quelque chose. Ce n'est pas la bonne méthode, si tu veux bien faire les choses, tu dois envoyer une requête HTTP avec la méthode DELETE.
    Ce qui est assez difficile à atteindre sans passer par du javascript, un XmlHttpRequest et tout le toutim. De base le browser ne permet de faire que du GET ou du POST, donc pour moi du POST est suffisant, il n'implémente pas un service RESTFUL là

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Pour répondre à la question, il faut d'abors que l'on sache comment tu gère tes utilisateurs. Si tu gére l'authentification directement au niveau de ton conteneur avec un LOGIN-FORM ou une authentification basic, tu peux simplement mettre une entrée dans ton web.xml disant que la servlet n'est accessible que par un admin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>suppression</web-resource-name>
            <url-pattern>/supprimerDocument</url-pattern>
            <http-method>POST</http-method>
        </web-resource-collection>
        <auth-constraint>
            <role-name>ADMINISTRATOR</role-name>
        </auth-constraint>
    </security-constraint>
    Sinon, comme suggéré un Filter que tu applique sur toutes les servlet. Dans tous les cas, pas besoin de dupliquer le code dans chaque servlet.

  6. #6
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 320
    Points : 3 741
    Points
    3 741
    Billets dans le blog
    12
    Par défaut
    Oui, à force de faire du RESTful avec JavaScript j'en oublie les limitations de la norme des <form> HTML qui n'autorisent pas le PUT et le DELETE
    Je ne connaissais pas ces balises, je me suis toujours demandé s'il y avait un équivalent de Spring Security avec les servlets, du coup comment gérer (setter/getter) le role-name de l'utilisateur ?
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  7. #7
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Gugelhupf Voir le message
    Je ne connaissais pas ces balises, je me suis toujours demandé s'il y avait un équivalent de Spring Security avec les servlets, du coup comment gérer (setter/getter) le role-name de l'utilisateur ?
    Pas sûr de comprendre ta question mais si tu cherches à tester le rôle d'un utilisateur authentifié, tu as la méthode isUserInRole(String role) de HttpServletRequest qui est là pour ça.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 320
    Points : 3 741
    Points
    3 741
    Billets dans le blog
    12
    Par défaut
    Salut OButterlin,

    Je faisais référence à la classe SecurityContextHolder de Spring pour récupérer le contexte et setter/getter l'Authentication (c'est une classe qui implémente l'interface Principal de Java). Du coup je n'ai pas vu de pattern équivalent dans le standard Java.

    Source: Documentation Spring pour la sécurité.
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  9. #9
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    C'est vrai que ça doit être différent, ils ont un module spécifique que je sache... mais comme je ne connais pas Spring plus que ça (je l'ai utilisé 1 mois sur 1 petit projet) je ne sais pas au juste ce que ça fait...
    J'utilise la pile standard JAAS, avec enrichissement de l'objet Principal pour gérer les attributs spécifiques dont on a besoin chez nous...
    Plus de nombreuses subtilités pour un "auto-login" via SPNEGO et une authentification par jeton... bref... rien de standard là
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Problème d'exécution d'une servlet avec Tomcat
    Par bmmdrs dans le forum Tomcat et TomEE
    Réponses: 7
    Dernier message: 03/09/2011, 18h54
  2. exécution d'une servlet
    Par pitchoblack dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 16/03/2008, 17h13
  3. Empêcher l'exécution d'une fonction
    Par effiix dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 07/09/2007, 18h17
  4. Empécher l'exécution d'une macro à l'ouverture
    Par infosorome dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 04/06/2007, 18h02
  5. [Débutant] problème d'exécution d'une servlet
    Par Le Pharaon dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 05/01/2007, 13h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo