持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
为什么要进行后端验证
现在为了节约后端资源,把越来越多的逻辑判断与校验工作放在前端去完成。但是这样同样会带来一个问题:客户端绕过攻击,通过一些工具,甚至浏览器调试工具就可以绕过前端的校验规则,直接去带有不符合规则要求的参数去访问后端接口。这样会造成后端程序错误等问题,从而引发一系列错误吗,甚至安全问题。
解决方法
对于客户端提交表单或者Ajax中的数据,后端的Controller必须先要做验证,然后才能使用这些数据。但是每次都对请求数据进行if校验,会造成大量的代码冗余,而且非常的不优雅。为了解决这一问题,我们可以使用Validation库,来解决相应的问题。
使用Validation库进行后端验证
添加依赖
添加相依的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
创建Form类
将接收到的参数封装成实体类,使用@ApiModel和@ApiModelProperty让他们在swagger里有相应的注释。 使用各种注解,对接收到的参数进行校验。
@ApiModel
@Data
public class TestSayHelloForm {
@NotBlank
@Pattern(regexp = "^[\\u4e00-\\u9fa5]{2,15}$")
@ApiModelProperty("姓名")
private String name;
}
| 序号 | 注解 | 解释 |
|---|---|---|
| 1 | @NotNull | 不能为空 |
| 2 | @NotBlank | 不能为空,且不能为空字符串 |
| 3 | @Min | 最小值 |
| 4 | @Max | 最大值 |
| 5 | @Range | 范围 |
| 5 | @Pattern | 正则表达式 如:@Pattern(regexp = "^[\u4e00-\u9fa5]{2,15}$")\表示2-15个汉字,[A-Za-z\u4e00-\u9fa5]这是英文 |
编写测试方法,测试功能
@RestController
@RequestMapping("/test")
@Api("测试Validation库后端验证")
public class TestController {
@PostMapping("/sayHello")
@ApiOperation("是否进行了后端校验")
public R sayHello(@Valid @RequestBody TestSayHelloForm form){
return R.ok().put("message","Hello,"+form.getName());
}
}
总结
只是进行前端校验,非常容易被客户端绕过攻击,这是非常不安全的一种做法,使用Validation库对请求参数进行校验,既能完善系统的健壮性,也能解决多个if语句的冗余。