0

Quelqu'un peut-il s'il vous plaît aidez-moi dans ce domaine. J'ai été désigné pour sécuriser une application Web existante. Lorsqu'un utilisateur se connecte déjà dans l'application (cela signifie que la session est active), un attaquant peut alors deviner les champs de saisie, enregistrer l'URL et créer une page similaire et envoyer un lien hypertexte. Si l'utilisateur clique sur ce lien, il ne passera pas par javascript, au contraire, il va frapper le contrôleur de printemps. Puisque la session est active, elle sauvegardera les données des attaquants dans la base de données.Printemps MVC Security Token authentification

Voici ce que nous utilisons maintenant. 1) Sécurité printemps

<http auto-config="true"> 
    <intercept-url pattern="/**" access="ROLE_ADMIN, ROLE_HR" /> 
    <custom-filter position="PRE_AUTH_FILTER" ref="siteminderFilter" /> 
</http> 

<beans:bean id="siteminderFilter" class="com.mywbsite.security.UserFilter"> 
    <beans:property name="authenticationManager" ref="authenticationManager" /> 
    <beans:property name="continueFilterChainOnUnsuccessfulAuthentication" value="false"/> 
</beans:bean> 

Cette méthode est appelée lorsque les journaux de l'utilisateur dans l'application première fois

protected Object getPreAuthenticatedPrincipal(HttpServletRequest request) { 

    String userId = request.getHeader("uid"); 
    logger.info("<<<<<<<<<<<<<<<<<<<<<userId>>>>>>>>>>>>>>>>>>>>>>> : "+userId); 

    return userId; 
} 

Cette méthode est appelée lorsque l'utilisateur fait tout ce qui appelle un contrôleur/java

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
     throws IOException, ServletException { 

    System.out.println(request.getParameter(BaseConstants.DV_USER_SESSION_IDENTIFIER)); 
    logger.info(request.getParameter(BaseConstants.DV_USER_SESSION_IDENTIFIER)); 
    logger.info("Existing the UserFilter.doFilter method..."); 
} 

Solution: Dans le contrôleur/filtre, je dois identifier si la demande provient de mon application ou de n'importe où ailleurs.

Voici ce que je pense mettre en œuvre. Créez un jeton aléatoire à l'intérieur de la méthode getPreAuthenticatedPrincipal() et stockez-le en session.

  • Récupère la variable de la session et la place dans une variable cachée dans jsp
  • Lorsque l'utilisateur fait une action, passe la variable cachée avec la valeur et passe au contrôleur comme paramètre de la requête.
  • Dans Contrôleur/Filtre obtenir la valeur aléatoire de la session et obtenir la valeur cachée du paramètre de demande. Maintenant comparez. Si cela correspond, alors faites une opération normale, sinon jetez la page d'erreur. Maintenant, mon souci est de savoir si j'implémente la solution ci-dessus, je dois écrire le code de variable cachée dans chaque jsp et passer au contrôleur dans chaque paramètre de demande et de demande.

    Pouvez-vous m'aider s'il vous plaît comment rendre facile. Merci d'avance

  • +0

    Essayez-vous d'utiliser siteminder? et implémenter l'authentification unique? Vous n'avez pas besoin de gérer explicitement la variable de session. –

    +0

    @JerinJoseph: Juste maintenant mis à jour le problème et comment je pense résoudre ce problème. Pourriez-vous s'il vous plaît le revoir. – SKumar

    Répondre

    0

    J'ai résolu le problème ci-dessus en utilisant Spring CSRF. J'ai fait face à un problème lors de la mise en œuvre du CSRF. Le problème était que CSRF créait 2 jetons. Il a fallu longtemps (au moins 1 jour) pour trouver la cause profonde. Les cas de racine était j'essayais d'obtenir la valeur de jeton de csrf dans mon Fiter et l'imprimais en utilisant le code ci-dessous. Donc, une fois que j'écris le request.getAttribute ("_ csrf"), il crée un nouveau jeton. Donc j'ai juste enlevé les lignes ci-dessous de mon csrf et juste fait ce qui a été décrit au-dessus du lien de csrf de ressort. Cela a fonctionné

    //  CsrfToken token = (CsrfToken) request.getAttribute("_csrf"); 
    //  System.out.println(">>>>>>>>>>UserFilter.getPreAuthenticatedPrincipal() CSRF Token: " + token.getToken());