spring boot rest接口安全需分层设防:关闭未授权入口(如actuator、swagger)、堵住参数注入与模型绑定漏洞、加固权限与数据归属校验、规范敏感信息输出。

Spring Boot 的 REST 接口安全漏洞不能靠“加个拦截器”或“统一返回错误”来解决,核心在于分层设防:从请求入口、参数处理、权限控制到数据输出,每个环节都有明确的修复动作和验证标准。
关闭未授权访问入口
很多高危漏洞(如数据泄露、服务器接管)直接源于接口未设防。重点检查三类暴露点:
-
Actuator 监控端点:默认 /actuator/env、/actuator/shutdown 等路径必须禁用或严格限制。生产环境推荐配置:
management.endpoints.web.exposure.include=health,info,并配合 Spring Security 限定 IP 白名单或登录鉴权; -
API 文档路径:Swagger/Knife4j 的 /swagger-ui.html、/doc.html、/v3/api-docs 等默认路径,在生产环境应彻底关闭。可通过配置
springdoc.api-docs.enabled=false和springdoc.swagger-ui.enabled=false实现; -
业务管理接口:如 /admin/**、/api/v1/users/** 等,不能仅依赖前端隐藏或 JS 校验,必须在后端显式声明访问规则,例如用
@PreAuthorize("hasRole('ADMIN')")或 SecurityFilterChain 中配置requestMatchers("/admin/**").hasRole("ADMIN")。
堵住参数注入与模型绑定漏洞
攻击者常通过构造恶意参数篡改数据或执行命令,关键防御点有两个:
-
SQL 注入防护:禁用 MyBatis 中的
${}字符串拼接,全部改用#{}占位符;对动态表名/字段名等极少数必须拼接的场景,使用白名单校验(如枚举匹配),而非直接透传用户输入; -
不安全模型绑定:避免
@ModelAttribute或@RequestBody直接绑定包含敏感字段(如isAdmin、accountBalance)的实体类。推荐做法是定义专用 DTO,只包含允许客户端修改的字段,并用@InitBinder配置WebDataBinder.setDisallowedFields()显式屏蔽危险属性。
加固权限与数据归属校验
鉴权 ≠ 授权,通过登录只是第一步,真正容易被绕过的,是“我能访问这个接口”之后的“我能不能看/改这条数据”:
- 对查询类接口(如
GET /api/orders/{id}),在 Service 层做数据归属校验:查出订单后,比对当前用户 ID 与订单 owner_id 是否一致,不一致直接抛AccessDeniedException; - 对修改类接口(如
PATCH /api/users/{id}),禁止客户端传入主键或关联 ID,改由后端从 JWT 或 Session 中提取当前用户上下文,再执行更新; - 垂直越权场景(如普通用户调用管理员专属接口),靠角色注解(
@Secured("ROLE_ADMIN"))+ 方法级@PreAuthorize双重控制,确保权限判断发生在方法执行前。
规范敏感信息与响应输出
漏洞不仅存在于输入,也藏在输出里:
- 日志中禁止打印完整请求体、响应体、堆栈或数据库连接信息,使用
@Slf4j记录时手动脱敏字段(如手机号打码为 138****1234); - HTTP 响应头补全安全策略:
X-Content-Type-Options: nosniff、X-Frame-Options: DENY、Content-Security-Policy,Spring Security 默认支持,只需启用http.headers().contentSecurityPolicy("default-src 'self'"); - 所有对外返回的 JSON 数据,对可能含脚本的内容(如用户昵称、评论)做 HTML 实体编码(如
<script></script>→<script>),可借助 Jackson 的@JsonSerialize自定义序列化器统一处理。











