Un fornitore ha pubblicato dati XML su HTTPS all'interno di una variabile modulo denominata XMLContent sul mio server applicazioni Coldfusion. Recentemente mi sono spostato a una versione più recente del server delle applicazioni e quelle richieste hanno generato 500 errori del server. Viene generato l'errore perché il contenuto di un secondo parametro di forma non è urlencoded correttamente, ma non ho comunque bisogno di tale parametro. (Ho contattato il fornitore per risolvere il problema, ma sono costretto a correggerlo, se possibile.)Utilizzare il filtro servlet per rimuovere un parametro del modulo dai dati registrati
Come utilizzare un filtro servlet per rimuovere tutto tranne il parametro del modulo named: XMLContent Ho provato vari tentativi per rimuovere esplicitamente il parametro offensivo "TContent" ma non viene mai rimosso.
Un frammento di dati che vengono ricevuti:
XMLContent=%3C%3Fxml+version%3D%221.0%22+encoding%3D%22UTF-8%22%3F%3E%0A%3CCheck+xmlns%3D%22http .........&TContent=<!--?xml version="1.0" encoding="UTF-8"?--><check xmlns="http...........
Il codice che ho provato:
import java.io.IOException;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.*;
public class MultipartFilter implements Filter {
// Init ----------------------------------------------------------------
public FilterConfig filterConfig;
// Actions -------------------------------------------------------------
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
/**
* Check the type request and if it is a HttpServletRequest, then parse the request.
* @throws ServletException If parsing of the given HttpServletRequest fails.
* @see javax.servlet.Filter#doFilter(
* javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws ServletException, IOException
{
// Check type request.
if (request instanceof HttpServletRequest) {
// Cast back to HttpServletRequest.
HttpServletRequest httpRequest = (HttpServletRequest) request;
// Parse HttpServletRequest.
HttpServletRequest parsedRequest = parseRequest(httpRequest);
// Continue with filter chain.
chain.doFilter(parsedRequest, response);
} else {
// Not a HttpServletRequest.
chain.doFilter(request, response);
}
}
/**
* @see javax.servlet.Filter#destroy()
*/
public void destroy() {
this.filterConfig = null;
}
private HttpServletRequest parseRequest(HttpServletRequest request) throws ServletException {
// Prepare the request parameter map.
Map<String, String[]> parameterMap = new HashMap<String, String[]>();
// Loop through form parameters.
Enumeration<String> parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()) {
String paramName = parameterNames.nextElement();
String[] paramValues = request.getParameterValues(paramName);
// Add just the XMLContent form parameter
if (paramName.equalsIgnoreCase("xmlcontent")) {
parameterMap.put(paramName, new String[] { paramValues[0] });
}
}
// Wrap the request with the parameter map which we just created and return it.
return wrapRequest(request, parameterMap);
}
// Utility (may be refactored to public utility class) ---------------
/**
* Wrap the given HttpServletRequest with the given parameterMap.
* @param request The HttpServletRequest of which the given parameterMap have to be wrapped in.
* @param parameterMap The parameterMap to be wrapped in the given HttpServletRequest.
* @return The HttpServletRequest with the parameterMap wrapped in.
*/
private static HttpServletRequest wrapRequest(
HttpServletRequest request, final Map<String, String[]> parameterMap)
{
return new HttpServletRequestWrapper(request) {
public Map<String, String[]> getParameterMap() {
return parameterMap;
}
public String[] getParameterValues(String name) {
return parameterMap.get(name);
}
public String getParameter(String name) {
String[] params = getParameterValues(name);
return params != null && params.length > 0 ? params[0] : null;
}
public Enumeration<String> getParameterNames() {
return Collections.enumeration(parameterMap.keySet());
}
};
}
}
Ma non è tutto chiaro per me. È possibile modificare il prodotto di terze parti e aggiungervi un filtro Servlet? Se sì, allora non sembra complicato con un filtro. Hai già provato qualcosa? – LaurentG
Sì, è possibile aggiungere un filtro servlet alla mia estremità, il fornitore mi sta inviando i dati ed è il mio server applicazioni Coldfusion a generare l'errore di stato 500. Ho provato con alcuni filtri diversi per farlo funzionare ma invano, invia sempre il secondo parametro del modulo. – Matt
Non sono sicuro, se possibile con un filtro. Tuttavia è più che possibile con Apache HTTP Server: http://stackoverflow.com/questions/6622018/urlrewritefilter-remove-parameters o http://wiki.apache.org/httpd/RewriteQueryString –