ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

SpringBoot接口安全:这5个漏洞必须堵上

SpringBoot接口安全:这5个漏洞必须堵上 SpringBoot 让接口开发变得飞快但“快”往往意味着安全被抛在脑后。很多项目上线后接口裸奔被扫到就是一顿薅。以下5个漏洞每一个都足以让你半夜被叫起来修数据。1. 接口裸奔未授权访问与越权最常见的漏洞接口只做了登录校验没做权限校验。比如/api/user/{id}只判断了“有没有登录”却没判断“这个 id 是不是当前用户的”。结果 A 用户改一下 URL 里的 id就能看到 B 用户的订单、地址甚至身份证号。垂直越权更可怕普通用户直接访问/api/admin/deleteUser如果后端只靠前端隐藏菜单那等于没防。堵法引入 Spring Security 或 Shiro给每个接口明确权限注解如PreAuthorize(hasRole(ADMIN))。对于资源归属必须在 Service 层校验currentUserId.equals(resource.getUserId())别信前端传的任何用户标识。记住前端校验是体验后端校验才是安全。2. SQL注入MyBatis 的${}是定时炸弹MyBatis 里#{}是预编译安全${}是字符串拼接直接注入。很多人在模糊查询时图方便写like %${keyword}%或者动态排序order by ${column}结果攻击者传个1 or 11就能拖库。JPA 里用Query拼接字符串同样危险。堵法能用#{}就别用${}。模糊查询用concat(%, #{keyword}, %)。动态排序必须用白名单校验比如只允许create_time、id等固定字段其他一律拒绝。永远不要相信用户输入能直接拼进 SQL。3. 敏感信息泄露返回全字段日志打密码接口直接返回User实体把password、salt、idCard全吐给前端。或者日志里log.info(用户登录{}, user)把密码明文打进日志文件。更隐蔽的是异常堆栈直接返回给前端暴露数据库表名、框架版本给攻击者送情报。堵法用 DTO/VO 返回只暴露必要字段。密码等敏感字段用JsonIgnore忽略。日志里严禁打印密码、token、身份证。全局异常处理返回统一错误码和模糊提示堆栈只进日志。别让接口成为信息泄露的帮凶。4. CSRF基于 Cookie 认证的隐形杀手如果接口用 Session/Cookie 认证攻击者诱导你点一个链接就能以你的身份发请求。比如GET /api/transfer?tohackeramount10000你一点钱就没了。SpringBoot 默认不防 CSRF因为很多人用 JWT 无状态认证但一旦用了 Cookie就必须防。堵法如果必须用 Cookie开启 Spring Security 的 CSRF 防护前端请求带CSRF-TOKEN。更推荐用 JWT 放在Authorization头天然免疫 CSRF。但 JWT 要设短过期时间配合刷新 token并且密钥不能硬编码在代码里。5. 无限流防重放接口被刷到崩登录接口不做限流攻击者用字典暴力破解短信接口不限流一条一块钱一晚上能刷掉几万块支付回调不做防重放同一笔订单反复通知导致重复发货。这些都不是危言耸听而是真实事故。堵法用 Redis Lua 做接口限流按 IP 或用户维度限制 QPS。登录失败次数过多锁定账号。短信验证码 60 秒内只能发一次且验证码只能用一次。支付回调必须验签并用唯一订单号做幂等处理过的回调直接返回成功不再重复处理。防重放可以用时间戳 nonce服务端缓存 nonce 一段时间。结语接口安全不是“加个登录”就完事它贯穿参数校验、权限控制、数据返回、日志记录、限流防重每一个环节。这5个漏洞每一个都有人栽过跟头。堵上它们你的 SpringBoot 接口才算真正上了锁。别等被薅光了才后悔安全这件事永远值得提前做。
返回列表