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是否可控利用

浙公网安备 33010602011771号