SpringBoot 接口参数校验系统 示例工程
一个基于SpringBoot的接口参数校验系统,通过自定义注解实现SQL注入防护、XSS攻击防护和枚举值校验。
功能特性
- SQL注入防护:自动检测和拦截SQL注入攻击
- XSS攻击防护:自动检测和拦截XSS攻击
- 枚举值校验:确保参数值在允许的枚举范围内
- 自定义注解:简洁的注解式参数校验
- 统一异常处理:友好的错误提示
- 可视化测试平台:Web界面实时测试校验效果
技术栈
- Spring Boot 3.2.0
- Spring Validation
- Hibernate Validator
- H2 Database
- Maven
快速开始
1. 克隆项目
git clone <repository-url>
cd SpringBoot-Parameter-Validation-Demo
2. 运行项目
mvn spring-boot:run
3. 访问测试页面
打开浏览器访问:http://localhost:8080
自定义注解
@NoSqlInjection - SQL注入防护
@NoSqlInjection(message = "参数包含SQL注入风险")
private String username;
参数说明:
message:校验失败时的错误信息strict:是否启用严格模式(默认true)
@NoXss - XSS攻击防护
@NoXss(message = "参数包含XSS攻击风险")
private String content;
参数说明:
message:校验失败时的错误信息sanitize:是否自动清理(默认true)
@EnumValue - 枚举值校验
@EnumValue(values = {"ACTIVE", "INACTIVE", "DISABLED"}, ignoreCase = true)
private String status;
参数说明:
values:允许的枚举值列表ignoreCase:是否忽略大小写(默认false)allowNull:是否允许null值(默认false)
API接口
创建用户
POST /api/users
Content-Type: application/json
{
"username": "testuser",
"password": "Password123",
"email": "test@example.com",
"phone": "13800138000",
"gender": "MALE",
"status": "ACTIVE",
"age": 25
}
搜索用户
GET /api/users/search?username=testuser
按状态查询用户
GET /api/users/status/{status}
添加评论
POST /api/users/comment?content=这是一条评论
使用示例
1. 在DTO中使用自定义注解
@Data
public class UserRequest {
@NotBlank(message = "用户名不能为空")
@Size(min = 3, max = 50, message = "用户名长度必须在3-50个字符之间")
@NoSqlInjection(message = "用户名包含SQL注入风险")
@NoXss(message = "用户名包含XSS攻击风险")
private String username;
@EnumValue(values = {"MALE", "FEMALE", "OTHER"}, ignoreCase = true)
private String gender;
}
2. 在Controller中使用校验
@RestController
@Validated
public class UserController {
@PostMapping
public ResponseEntity<ApiResponse<UserRequest>> createUser(
@Valid @RequestBody UserRequest request) {
// 业务逻辑
}
@GetMapping("/search")
public ResponseEntity<ApiResponse<String>> searchUser(
@RequestParam @NoSqlInjection @NoXss String username) {
// 业务逻辑
}
}
校验规则
SQL注入检测规则
- 检测常见SQL关键字:SELECT, INSERT, UPDATE, DELETE, DROP, UNION等
- 检测SQL注释符号:--, /*, */
- 检测SQL注入模式:' OR '1'='1, UNION SELECT等
XSS攻击检测规则
- 检测HTML标签:script, iframe, object等
- 检测JavaScript事件:onclick, onerror, onload等
- 检测JavaScript协议:javascript:
枚举值校验规则
- 参数值必须在指定的枚举值列表中
- 支持大小写忽略
- 支持null值处理
配置说明
validation:
sql-injection:
enabled: true
keywords: SELECT,INSERT,UPDATE,DELETE,DROP,UNION,EXEC,EXECUTE,TRUNCATE,ALTER,CREATE,DROP
xss:
enabled: true
patterns: <script,javascript:,onerror,onload,onclick,onmouseover,<iframe,<object,<embed
测试用例
SQL注入测试用例
SELECT * FROM users
admin' OR '1'='1
'; DROP TABLE users; --
1; INSERT INTO users VALUES (...)
UNION SELECT username, password FROM users
XSS攻击测试用例
<script>alert('XSS')</script>
<img src=x onerror=alert('XSS')>
<iframe src='javascript:alert(1)'>
<body onload=alert('XSS')>
<a href='javascript:alert(1)'>click</a>
枚举值测试用例
ACTIVE - 合法
INACTIVE - 合法
DISABLED - 合法
INVALID - 非法
最佳实践
- 在DTO类上使用注解:将校验规则集中在DTO类中
- 组合使用多个注解:同时使用多个校验注解提高安全性
- 自定义错误信息:提供清晰的错误提示
- 统一异常处理:使用全局异常处理器统一处理校验异常
- 测试覆盖:编写单元测试覆盖各种校验场景
扩展功能
- 支持自定义校验规则
- 支持国际化错误信息
- 支持校验结果缓存
- 支持异步校验
源码下载
- 项目代码已上传,关注公众号「服务端技术精选」,回复「参数校验」获取
标题: SpringBoot 接口参数校验系统 示例工程
作者:jiangyi
地址:http://jiangyi.space/articles/2026/03/02/1772277228973.html
公众号:服务端技术精选
评论
0 评论