这个问题是如何发生的呢?下面深入看看:
? Struts2官方站点提供的Struts 2 的整体结构

一个请求在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清理状态并返回。
这个究竟发生在哪个流程呢?
我们访问:
http://test.struts.com/admin/modelAdmin!listModel.action?cid=000H000A
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();
}
,,,,

XWork ParameterInterceptor类绕过安全限制漏洞-解决1相关推荐

  1. rmi反序列化导致rce漏洞修复_JAVA反序列化漏洞解决办法

    一.漏洞描述: 近期,反序列化任意代码执行漏洞持续发酵,越来越多的系统被爆出存在此漏洞.Apache Commons工具集广泛应用于JAVA技术平台,存在Apache Commons Componen ...

  2. Apache Shiro 1.6.0 发布!修复绕过授权高危漏洞

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 冷冷zz 来源 | https://www.o ...

  3. java反序列化漏洞的成因,JAVA反序列化漏洞解决办法

    一.漏洞描述: 近期,反序列化任意代码执行漏洞持续发酵,越来越多的系统被爆出存在此漏洞.Apache Commons工具集广泛应用于JAVA技术平台,存在Apache Commons Componen ...

  4. CTF:PHP MD5绕过和序列化漏洞

    CTF:PHP MD5绕过和序列化漏洞 作者:高玉涵 博客:blog.csdn.net/cg_i 时间:2021.6.25 9:51 题目复现Docker环境: https://github.com/ ...

  5. 多线程下ArrayList类线程不安全的解决方法及原理

    多线程下ArrayList类线程不安全的解决方法及原理 参考文章: (1)多线程下ArrayList类线程不安全的解决方法及原理 (2)https://www.cnblogs.com/fangting ...

  6. IDEA——找不到或无法加载主类的一种暴力解决方法

    IDEA--找不到或无法加载主类的一种暴力解决方法 参考文章: (1)IDEA--找不到或无法加载主类的一种暴力解决方法 (2)https://www.cnblogs.com/jsjliyang/p/ ...

  7. SQL注入漏洞解决方法

    本文只指针编码层次的SQL注入漏洞解决方法,例子代码是以java为主. 1,参数化的预编译查询语句 不安全例子 String query = "SELECT account_balance ...

  8. 【MyBatis】sql列名与实体类属性名不同的解决方式

    sql列名与Java实体类属性名不同的解决方式 例如: 数据库 CREATE TABLE orders(order_id INT PRIMARY KEY AUTO_INCREMENT,order_no ...

  9. idea类存在找不到解决办法

    idea类存在找不到解决办法 996的程序猿 2019-01-09 13:23:07 51954 收藏 101 分类专栏: 工具类 文章标签: idea 找不到类 idea 找不到符号 版权 1.刷新 ...

最新文章

  1. 改变图像,运用match方法判断
  2. 图解用MySQL创建进销存数据库
  3. win7系统登录界面出现“其他用户” (登录界面显示多个用户)
  4. 使用navigator对象,输出当前浏览器的信息
  5. matlab R2012a in ubuntu12.04
  6. 玩转VIM编辑器-自动补全
  7. ---调试-用try-catch语句检查错误
  8. 使用jave进行视频转码
  9. 动软代码生成器-模板修改,模型修改
  10. 画 ArcFace 中的 margin 曲线
  11. TPC,TPCC,TPMC(数据库性能衡量指标)
  12. 音乐外链php修复版源码
  13. bcdedit添加linux引导,用BCDEdit编辑启动菜单
  14. grep命令 |grep
  15. 全球移动通信系统GSM(2G)
  16. Java中的包(package)详情解释
  17. 湖北智禾网店指导:入门卖家一定要了解的淘宝宝贝发布规则及注意事项。
  18. 创富路径---李嘉诚--王永庆--刘永好
  19. 使用SMTP协议命令行发送邮件
  20. 知识:视频流媒体播放的一些知识

热门文章

  1. 我在51CTO的第一篇博文!
  2. 推荐 10 个有趣的 Python 项目
  3. 主梁弹性模量计算_如何用梁格法计算曲线梁桥?
  4. 缓冲池Buffer Pool
  5. 单体 Bean 注册实例
  6. 分布式会话拦截器2 - 会话判断
  7. Spring系列之BeanPostProcessor分析
  8. flume高可用-failover-模型分析
  9. 缺省参数-回顾列表的排序方法明确缺省参数的概念及作用
  10. Git初始化及仓库创建和操作