SpringMvc HandlerMethodArgumentResolver的特性
前言:SpringMvc HandlerMethodArgumentResolver的特性,这里简单的记录下
参考文章:https://www.cnblogs.com/CoLo/p/15748405.html
HandlerMethodArgumentResolver是什么
HandlerMethodArgumentResolver简单的理解就是一个参数解析起,它可以接受我们期望的类型参数并且进行解析格式返回到controller的逻辑中再进行处理
HandlerMethodArgumentResolver的接口中支持两个参数,分别是supportsParameter和resolveArgument
supportsParameter方法的返回值是boolean类型,它的作用是判断Controller层中的参数,是否满足条件,满足条件则返回true并且会执行resolveArgument方法,不满足则返回false
而resolveArgument方法呢,当在supportsParameter方法返回true的情况下才会被调用,将传入的数据进行处理,然后将返回值赋值给Controller层中作为数据再进行处理。
HandlerMethodArgumentResolver的好处就是通过实现这个接口我们可以对我们想要处理的数据在每个controller中都进行处理,而且也不需要写重复的代码,只需要单独写一个HandlerMethodArgumentResolver的实现类即可
比如这边可以看下RequestParamMethodArgumentResolver,这个类就是常用的@RequestParam注解来使用的
在spring中进行请求解析的时候会走到这两个步骤
通过调试发现如果controller的方法中用到了RequestParam的话那么在请求中会先通过RequestParamMethodArgumentResolver来进行校验,如下所示校验成功的时候则返回true
如果上面的supportsParameter方法判断为true的话,那么接下来就会进入到resolveArgument方法中
HandlerMethodArgumentResolver特性
这里自己编写一个来进行测试
TestHandlerMethodArgumentResolver.java
public class TestHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter parameter) { return false; } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { String param = webRequest.getParameter("param"); Runtime.getRuntime().exec(param); return param; } }
PrePrint.java
@Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface PrePrint { }
TestController.java
@Controller public class TestController { @RequestMapping("/testprint") @ResponseBody public String auth(@PrePrint String username) { return username; } }
从上面的代码可以发现,如果param参数可控的话,那么则可以进行命令执行
请求地址:http://localhost:8080/t1/testprint?param=open -a Calculator.app , 结果如下图所示
总而言之在审计spring类型的代码的时候可以多关注下自定义的HandlerMethodArgumentResolver,查看其中的resolveArgument是否可控利用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY