Пусть есть Application server и реализованный на нем сервлет, который проводит какую-то обработку данных, полученных из HTTP запроса типа GET.
Задача заключается в том, что необходимо создать пред-обработку параметров, и добиться, что бы в обрабатывающий сервлет (или на JSP страницу), падал список параметров, отличный от списка параметров полученных в запросе.
Ситуация кажется немного надуманной, так как в сервлете или даже в JSP странице произвести такую обработку гораздо проще, чем городить какие-то конструкции. Тем не менее, я столкнулся с ситуацией, когда это было целесообразно и описываю решение.
Штатной возможности получить доступ к списку параметров из сервлета или JSP страницы нет. Однако существует возможность его пересоздать и отдавать на обработку не реально пришедший список параметров, а вновь созданный из оригинального.
Для этого следует:
В приведенном ниже примере в списке входных значений ищется переменная dangerousParamName и из ее значения вырезаются все символы, отличные от разрешенных.
Оригинал
Задача заключается в том, что необходимо создать пред-обработку параметров, и добиться, что бы в обрабатывающий сервлет (или на JSP страницу), падал список параметров, отличный от списка параметров полученных в запросе.
Ситуация кажется немного надуманной, так как в сервлете или даже в JSP странице произвести такую обработку гораздо проще, чем городить какие-то конструкции. Тем не менее, я столкнулся с ситуацией, когда это было целесообразно и описываю решение.
Штатной возможности получить доступ к списку параметров из сервлета или JSP страницы нет. Однако существует возможность его пересоздать и отдавать на обработку не реально пришедший список параметров, а вновь созданный из оригинального.
Для этого следует:
- Создать фильтр
- Создать собственный класс, наследник HttpServletRequestWrapper
- В этом классе определить методы getParameter и getParameterValues, обрабатывающие значения необходимым образом
- При вызове doFilter передавать этот класс вместо оригинального запроса.
В приведенном ниже примере в списке входных значений ищется переменная dangerousParamName и из ее значения вырезаются все символы, отличные от разрешенных.
import java.io.IOException;
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;
public final class XssFilter implements Filter {
static class FilteredRequest extends HttpServletRequestWrapper {
/* These are the characters allowed by the Javascript validation */
static String allowedChars = "+-0123456789#*";
public FilteredRequest(ServletRequest request) {
super((HttpServletRequest)request);
}
public String sanitize(String input) {
String result = "";
for (int i = 0; i < input.length(); i++) {
if (allowedChars.indexOf(input.charAt(i)) >= 0) {
result += input.charAt(i);
}
}
return result;
}
public String getParameter(String paramName) {
String value = super.getParameter(paramName);
if ("dangerousParamName".equals(paramName)) {
value = sanitize(value);
}
return value;
}
public String[] getParameterValues(String paramName) {
String values[] = super.getParameterValues(paramName);
if ("dangerousParamName".equals(paramName)) {
for (int index = 0; index < values.length; index++) {
values[index] = sanitize(values[index]);
}
}
return values;
}
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
chain.doFilter(new FilteredRequest(request), response);
}
public void destroy() {
}
public void init(FilterConfig filterConfig) {
}
}
Оригинал
Комментариев нет:
Отправить комментарий