Modification des paramètres de requête avec des filtres de servlet
Problème :
Une vulnérabilité de sécurité (XSS) existe dans une application Web existante hébergée sur Tomcat 4.1. En raison des limitations liées à la modification du code source, un filtre de servlet est envisagé pour nettoyer les paramètres sensibles avant de les transmettre aux pages vulnérables. Cependant, l'interface ServletRequest ne dispose pas d'une méthode setParameter pour modifier les valeurs des paramètres.
Solution :
Option 1 : sous-classe HttpServletRequestWrapper
Bien que HttpServletRequest ne dispose pas de la méthode souhaitée, le La classe HttpServletRequestWrapper permet d'encapsuler une requête avec une autre. En sous-classant cette classe et en remplaçant la méthode getParameter, vous pouvez renvoyer la valeur du paramètre nettoyée. Cette requête modifiée peut ensuite être transmise dans la chaîne de filtrage au lieu de la requête d'origine.
Extrait de code :
<code class="java">import javax.servlet.*; import javax.servlet.http.*; public class XssFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // Create a wrapped request with sanitized parameter HttpServletRequest wrappedRequest = new HttpServletRequestWrapper((HttpServletRequest) request) { @Override public String getParameter(String parameterName) { String originalValue = super.getParameter(parameterName); return sanitize(originalValue); } }; chain.doFilter(wrappedRequest, response); } ... }</code>
Option 2 : Utiliser les attributs de la requête
Une approche plus raffinée consiste à modifier le servlet ou le JSP vulnérable pour attendre un attribut de requête au lieu d'un paramètre. Le filtre examine le paramètre, apporte les modifications nécessaires et définit la valeur nettoyée en tant qu'attribut à l'aide de request.setAttribute().
Extrait de code pour JSP :
<code class="jsp"><jsp:useBean id="myBean" ...> <jsp:setProperty name="myBean" property="sanitizedParam" value="${requestScope['sanitizedParam']}" /></code>
Extrait de code pour Servlet :
<code class="java">import javax.servlet.*; import javax.servlet.http.*; public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // Retrieve the sanitized parameter from the attribute String sanitizedParam = (String) request.getAttribute("sanitizedParam"); } }</code>
Remarques :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!