【问题标题】:How to get raw parameters before mapping映射前如何获取原始参数
【发布时间】:2013-06-06 09:44:22
【问题描述】:

我遇到了 Struts 1 框架的新问题。我需要过滤页面中的一些输入值,因此我编写了自定义过滤器来执行此操作。

它适用于未映射到任何形式的单个参数。但是当它映射到某些struts的Form字段时,它并没有获取参数。

有人知道如何处理吗?

这是我的过滤器的代码

public class XSSFillter implements Filter {


@Override
public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
    chain.doFilter(new XSSRequest((HttpServletRequest) request), response);
}

@Override
public void init(FilterConfig filterConfig) throws ServletException {       
}

@Override
public void destroy() {
}
    }

还有

public class XSSRequest extends MultipartRequestWrapper{

public XSSRequest(HttpServletRequest request) {
    super(request);
}

@Override
public String[] getParameterValues(String name) {
    String[] values = super.getParameterValues(name);

    if(values == null){
        return null;
    }

    String[] newValues = new String[values.length];

    for(int index = 0; index < values.length; index++ ){
        newValues[index] = XSSFilterUtil.removeXSSTokens(values[index]);
    }

    return newValues;
}

@Override
public String getParameter(String name) {
    String value = super.getParameter(name); 
    return XSSFilterUtil.removeXSSTokens(value);
}

@Override
public String getHeader(String name) {
    String value = super.getHeader(name);
    return XSSFilterUtil.removeXSSTokens(value);
}
}

当然我已经在 web.xml 中定义了

我猜这是最重要的部分之一。

if (isMultipart) {
            parameterValue = multipartParameters.get(name);
        } else {
            parameterValue = request.getParameterValues(name);
        }

因此,在一种情况下,parameterValue 取自 multipartParameters,而它们又在一些临时文件中定义。我认为最好的方法是修改所有请求参数,然后让它扔掉 Struts 1.3.8 库。

【问题讨论】:

  • 在不知道自己在做什么的情况下很难提供帮助。 “过滤一些输入值”是什么意思?
  • 我需要在 XSS 内容上过滤我的输入值。
  • 你是怎么做到的?不是 XSS 过滤帖子,我指的是修改参数值的机制。我们需要代码。
  • 我已经编辑了我的帖子。谢谢!
  • 它是多部分表单吗?还是多部分和非多部分的行为相同?

标签: java parameters filter struts


【解决方案1】:

我对此非常生疏,但 ActionForm.reset(ActionMapping, HttpServletRequest) 方法可能会给你你想要的。

几年前我不得不在映射属性之前使用它来计算一些东西,此时您应该可以访问所有请求参数。

【讨论】:

    【解决方案2】:

    经过两天的研究和实验,我找到了一些解决方案。我写了自定义 MultipartRequestHandler

    public class XSSMultipartRequestHandler extends CommonsMultipartRequestHandler {
    
        @Override
        public Hashtable getAllElements() {
            Hashtable table = super.getAllElements();
            for (Object key : table.keySet()) {
                Object value = table.get(key);
                if (value instanceof String[]) {
                    String[] arr = (String[]) value;
                    String[] newValue = { XSSFilterUtil.removeXSSTokens(arr[0]) };
                    table.put(key, newValue);
                }
            }
            return table;
        }
    
    }
    

    您还需要编写自定义 RequestProcessor,因为在验证之前将请求包装到 MultipartRequestWrapper

    public class XSSRequestProcessor extends TilesRequestProcessor {
    
        @Override
        protected boolean processValidate(HttpServletRequest request,
                HttpServletResponse response, ActionForm form, ActionMapping mapping)
                throws IOException, ServletException, InvalidCancelException {
            return super.processValidate(new XSSFilteredRequest(request), response, form, mapping);
        }
    
    }
    

    在struts-config中

    <controller processorClass="com.package.filter.XSSRequestProcessor" multipartClass="com.package.filter.XSSMultipartRequestHandler" contentType="text/html; charset=UTF-8"/>
    

    就是这样:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-14
      • 1970-01-01
      • 2021-09-12
      • 2021-12-12
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 2017-02-24
      相关资源
      最近更新 更多