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   - 非法

最佳实践

  1. 在DTO类上使用注解:将校验规则集中在DTO类中
  2. 组合使用多个注解:同时使用多个校验注解提高安全性
  3. 自定义错误信息:提供清晰的错误提示
  4. 统一异常处理:使用全局异常处理器统一处理校验异常
  5. 测试覆盖:编写单元测试覆盖各种校验场景

扩展功能

  • 支持自定义校验规则
  • 支持国际化错误信息
  • 支持校验结果缓存
  • 支持异步校验

源码下载

  • 项目代码已上传,关注公众号「服务端技术精选」,回复「参数校验」获取

标题: SpringBoot 接口参数校验系统 示例工程
作者:jiangyi
地址:http://jiangyi.space/articles/2026/03/02/1772277228973.html
公众号:服务端技术精选
    评论
    0 评论
avatar

取消