《Spring Framework RCE CVE-2022-22965漏洞复现报告》 11 SpringMVC参数绑定为了方便编程SpringMVC支持将HTTP请求中的的请求参数或者请求体内容根据Controller方法的参数自动完成类型转换和赋值。之后Controller方法就可以直接使用这些参数避免了需要编写大量的代码从HttpServletRequest中获取请求数据以及类型转换。下面是
SpringMVC参数绑定
SpringMVC参数绑定是指将HTTP请求中的请求参数或请求体内容,根据Controller方法的参数,自动完成类型转换和赋值的过程。这样,Controller方法就可以直接使用这些参数,避免了需要编写大量的代码从HttpServletRequest中获取请求数据以及类型转换。
示例
以下是一个简单的示例,演示了如何使用SpringMVC参数绑定:
@Controller
public class UserController {
@RequestMapping("/addUser")
public @ResponseBody String addUser(User user) {
return "OK";
}
}
public class User {
private String name;
private Department department;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
}
public class Department {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
当请求为/addUser?name=test&department.name=SEC时,addUser方法中的user参数内容如下:
User{name='test', department=Department{name='SEC'}}
可以看到,name自动绑定到了User对象的name属性上,department.name自动绑定到了User对象的department属性的name属性上。
注意,SpringMVC支持多层嵌套的参数绑定。实际上,department.name的绑定是通过调用链实现的:
User.getDepartment()
Department.setName()
假设请求参数名为foo.bar.baz.qux,对应Controller方法入参为Param,则有以下的调用链:
Param.getFoo()
Foo.getBar()
Bar.getBaz()
Baz.setQux() // 注意这里为set
实现原理
SpringMVC实现参数绑定的主要类和方法是WebDataBinder.doBind(MutablePropertyValues)。该方法会根据Controller方法的参数类型,创建对应的JavaBean对象,并将请求参数绑定到JavaBean对象的属性上。具体实现过程如下:
- 通过反射创建Controller方法的参数类型的实例对象。
- 将请求参数转换为
MutablePropertyValues对象。 - 调用
WebDataBinder.bind(MutablePropertyValues)方法,将MutablePropertyValues对象绑定到JavaBean对象的属性上。 - 将JavaBean对象作为Controller方法的参数,传递给Controller方法。
在绑定属性值时,SpringMVC会根据属性的类型和名称,自动进行类型转换和赋值。如果属性是一个复杂类型(如Department),则会递归调用上述绑定过程,直到所有属性都被绑定完成。
需要注意的是,SpringMVC默认情况下会将请求参数名中的.转换为JavaBean对象属性的.,并将请求参数名中的_转换为JavaBean对象属性的_。例如,请求参数名为user.name,则会自动绑定到User对象的name属性上。如果需要修改这种转换规则,可以通过@InitBinder注解自定义WebDataBinder对象的属性编辑器
原文地址: http://www.cveoy.top/t/topic/ghSf 著作权归作者所有。请勿转载和采集!