@Documented @Target(value=PARAMETER) @Inherited @Retention(value=RUNTIME) public @interface AllowedParams
对绑定到模型的参数做过滤
spring 提供的动态绑定 如果是使用的数据表模型,则导致一些不应该在前端修改参数而出现不安全隐患。 比如,用户模型,我在更新用户年龄的时候,不允许更新生日 如下代码就会导致,只要客户端恶意传递了参数 birthday,如果模型有对应的属性的话就可能被更新到。
@PostMapping("/update")
public String update(User user, @PathVariable("id") Long id) {
userService.update(user,id);
return "update/success";
}
过滤的方式有3种方式:
class UserFrom {
private Integer age;
public Integer getAge(){
return age;
}
public setAge(Integer age){
this.age = age;
}
}
@PostMapping("/update")
public String update(UserForm user, @PathVariable("id") Long id) {
userService.update(user,id);
return "update/success";
}
@PostMapping("/update")
public String update(HtttpServletRequest request, @PathVariable("id") Long id) {
User user = new User();
user.setAge(request.getParameterValue("age"));
userService.update(user,id);
return "update/success";
}
先配置参数解析器
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addArgumentResolvers(List<HandterMethodArgumentResolver> argumentResolvers) {
//添加自定义的参数解析注解器
argumentResolvers.add(new AllowedParamsModelAttributeMethodProcessor());
super.addArgumentResolvers(argumentResolvers);
}
};
}
给方法参数添加注解
@PostMapping("/update")
public String update( @AllowedParams(params={"age"}) User user, @PathVariable("id") Long id) {
userService.update(user,id);
return "update/success";
}
public abstract String[] params
Copyright © 2017 Pivotal Software, Inc.. All rights reserved.