2017-07-02 1 views
0

Je dois implémenter un filtre pour empêcher l'attaque XSS dans mon portail Liferay. J'ai lu beaucoup de réponses à ce sujet, j'ai donc utilisé un HttpServletRequestWrapper pour ajouter des paramètres aseptisés à ma demande. Mon filtre fonctionne correctement: débogage du code J'ai réalisé que le filtre prend le paramètre et l'assainit. Mon problème est que dans le processAction d'un portlet je ne suis pas capable de récupérer le paramètre sanitized en utilisant request.getParameter() mais je reçois toujours le paramètre old sanitized.Obtenir le paramètre assaini de processAction - Liferay

Par exemple, supposons que j'ai un portlet avec une forme simple comme ceci:

enter image description here

Comme vous pouvez le voir dans le champ de saisie il y a une étiquette b pour aseptiser. Lorsque le formulaire est soumis, mon filtre est appelé et il lance la méthode doFilter(). Ma méthode doFilter parcourt tous les paramètres d'assainissement. Ensuite, je les ajoute dans mon WrappedRequest:

/* 
    * Did it make any difference? 
    */ 
    if (!Arrays.equals(processedParams, params)) { 
     logger.info("Parameter: " + params[0] + " sanitized with: " + processedParams[0]); 
     /* 
     * If so, wrap up the request with a new version that will return the trimmed version of the param 
     */ 
     HashMap<String, String[]> map = new HashMap<>(); 
     map.put(name, processedParams); 
     final HttpServletRequestWrapper newRequest = new ExtendedRequestWrapper(httpServletRequest,map);      


     /* 
     * Return the wrapped request and forward the processing instruction from 
     * the validation rule 
     */ 
     return newRequest; 

Ma classe ExtendedRequestWrapper implémente la méthode getParameter:

public class ExtendedRequestWrapper extends HttpServletRequestWrapper { 

    private final Map<String, String[]> modifiableParameters; 
    private Map<String, String[]> allParameters = null; 


    public ExtendedRequestWrapper(final HttpServletRequest request, 
      final Map<String, String[]> additionalParams) 
    { 
     super(request); 
     this.modifiableParameters = new TreeMap<String, String[]>(); 
     this.modifiableParameters.putAll(additionalParams); 
    } 

    @Override 
    public String getParameter(final String name) 
    { 
     String[] strings = getParameterMap().get(name); 
     if (strings != null) 
     { 
      return strings[0]; 
     } 
     return super.getParameter(name); 
    } 

    @Override 
    public Map<String, String[]> getParameterMap() 
    { 
     if (this.allParameters == null) 
     { 
      this.allParameters = new TreeMap<String, String[]>(); 
      this.allParameters.putAll(super.getParameterMap()); 
      this.allParameters.putAll(modifiableParameters); 

     } 
     //Return an unmodifiable collection because we need to uphold the interface contract. 
     return Collections.unmodifiableMap(allParameters); 
    } 

    @Override 
    public Enumeration<String> getParameterNames() 
    { 
     return Collections.enumeration(getParameterMap().keySet()); 
    } 

    @Override 
    public String[] getParameterValues(final String name) 
    { 
     return getParameterMap().get(name); 
    } 
} 

Maintenant, quand j'essaie d'accéder à params aseptisés dans mon processAction() Je récupère l'ancienne valeur, celui-là non désinfecté:

@Override 
public void processAction(ActionRequest request, ActionResponse response) throws PortletException, IOException { 
    String azione = request.getParameter("MyXSSaction"); 
    if(azione.equals("XSSAttack")) {   
    String descr = req.getParameter("mydescr"); 
    } 
} 

Comment puis-je résoudre?

Répondre

0

Vous ne devriez pas le faire de manière générique dans votre gestion des entrées. Tout d'abord, il n'y a pas de XSS dans <b>, car le second S dans XSS est pour 'scripting' - et <b> ne contient aucun script. Deuxièmement, une application générale et approfondie d'un tel filtre vous empêchera d'ajouter du contenu Web approprié, des articles de blog et d'autres contenus, où le formatage est légitimement effectué. Troisièmement, disons que vous avez un système de gestion de livres aléatoire: Pourquoi les gens ne pourraient-ils pas entrer Let x < 5 comme titre de livre, ou même <script>alert('XSS')</script> and what to do against it - ne seraient-ils pas des titres de livres appropriés? En fait, ils seraient des données correctes, et vous voulez leur échapper quand vous affichez.

Il pourrait y avoir un argument pour désinfecter (comme le plugin AntiSamy de Liferay) certains éléments s'ils sont destinés à être affichés en HTML. Mais tout autre élément doit juste être correctement échappé pendant la sortie. Une autre façon de le dire: ces paramètres ne sont dangereux que si vous ne leur échappez pas correctement lorsqu'ils sont affichés dans des pages HTML - mais si vous les intégrez dans un corps de texte/courrier électronique, ils sont complètement inoffensifs .