XWork ParameterInterceptor类绕过安全限制漏洞-解决1

XWork ParameterInterceptor类绕过安全限制漏洞-解决1
一个请求在Struts2 框架中的处理大概分为以下几个步骤:
Struts2框架的调用流程:
1、当 Servlet 容器接收到一个请求后,将请求交给你在 web.xml 中配置的过滤器 FilterDispatcher ,调用它的 doFilter() 方法。
 
2 FilterDispatcher 询问 ActionMapper ,以便确定这个请求是否有对应的 action 调用。
 
3 ActionMapper 返回一个描述了 action 调用的 ActionMapping 对象。
 
4 FilterDispatcher 调用 Dispatcher 类的 serviceAction() 方法。
 
5 Dispatcher 调用 ActionProxy executed ()方法。
 
6 ActionProxy 设置 ActionInvocation 对象的执行上下文,然后调用其 invoke ()方法。
 
7 ActionInvocation invoke ()方法从拦截器映射中查找尚未执行的拦截器,调用它的 intercept invocation )方法,并将自身对象的引用作为参数传递给拦截器。
 
8、拦截器完成某些预处理工作后,反过来调用 ActionInvocation invoke ()方法。
ActionInvocation维护着自己的状态,所以它知道哪些拦截器已经被执行,如果还有未执行的拦截器,就继续执行它的 intercept invocation )方法。
 
9、如果所有的拦截器都已经执行过了,就调用 action 实例的 executed ()方法(如果 struts.xml 文件中没有被设置成其他方法的话)。
 
10 ActionInvocation 根据 action 执行返回的接过码,查找对应的 Result ,调用 Result executed invocation )的方法,将结果页面呈现给用户。
 
11 ActionInvocation invoke ()方法将控制权返回给拦截器映射中的最后一个拦截器,该拦截器完成所有必须的后期处理工作,然后从 interce invocation )方法返回,允许前一个拦截器执行它自己的后续处理工作。如次反复,直到所有的拦截器都成功返回。
 
12 ActionInvocation invoke ()方法执行完毕后,向 ActionProxy 返回一个 String 类型的结果码,最后, ActionProxy 清理状态并返回。
 
这个究竟发生在哪个流程呢?
我们访问:
DEBUG整个流程:
DEBUG [com.opensymphony.xwork2.interceptor.StaticParametersInterceptor] - Setting static parameters {}
2010-07-19 13:36:26,718
DEBUG [com.opensymphony.xwork2.interceptor.ParametersInterceptor] - Setting params cid => [ 000H000A ]
可以看到,发生在拦截器那个流程,处理请求参数的ParameterInterceptor 类,还记得第七步说什么吗?
7、ActionInvocation的invoke()方法从拦截器映射中查找尚未执行的拦截器,调用它的intercept(invocation)方法,并将自身对象的引用作为参数传递给拦截器。
就是调用:ParameterInterceptor 的
intercept(ActionInvocation invocation)
public class ParametersInterceptor extends MethodFilterInterceptor
{
public String doIntercept(ActionInvocation invocation)
    throws Exception
  {
    Object action = invocation.getAction();
    if (!(action instanceof NoParameters)) {
      ActionContext ac = invocation.getInvocationContext();
      Map parameters = ac.getParameters();
      if (LOG.isDebugEnabled()) {
LOG.debug("Setting params " + getParameterLogMap(parameters));
      }
      if (parameters != null) {
        Map contextMap = ac.getContextMap();
        try {
          OgnlContextState.setCreatingNullObjects(contextMap, true);
          OgnlContextState.setDenyMethodExecution(contextMap, true);
          OgnlContextState.setReportingConversionErrors(contextMap, true);
          ValueStack stack = ac.getValueStack();
          setParameters(action, stack, parameters);
        } finally {
          OgnlContextState.setCreatingNullObjects(contextMap, false);
          OgnlContextState.setDenyMethodExecution(contextMap, false);
          OgnlContextState.setReportingConversionErrors(contextMap, false);
        }
      }
    }
    return invocation.invoke();
  }
,,,,

本文出自 “leolee ” 博客,请务必保留此出处http://jooben.blog.51cto.com/253727/352955

你可能感兴趣的:(框架,工作,xml,struts,servlet)