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:
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?