news 2026/5/1 7:09:23

从一次 Spring Boot + MySQL 报错,看 Web 攻击面与防御模型,用安全视角复盘攻击面、风险点与防御机制的记录。

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从一次 Spring Boot + MySQL 报错,看 Web 攻击面与防御模型,用安全视角复盘攻击面、风险点与防御机制的记录。

零、项目代码和攻击面介绍

众嗦粥汁,一个spring boot项目里DemoAplication是启动器,各个Controller是主要的攻击面,config是副攻击面,现在我通过AI写了一个spring boot项目并分析它的攻击点,以下是Usercontroller的代码和整个项目的结构

package com.liangning.demo.controller; import com.liangning.demo.common.Result; import com.liangning.demo.entity.User; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.web.bind.annotation.*; import java.util.Map; @RestController @RequestMapping("/user") public class UserController { private final JdbcTemplate jdbcTemplate; public UserController(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } // ✅ 查询用户:/user/get?id=1 @GetMapping("/get") public Result<User> getUser(@RequestParam Long id) { String sql = "SELECT id, name FROM users WHERE id = ?"; Map<String, Object> row = jdbcTemplate.queryForMap(sql, id); User u = new User(); u.setId(((Number) row.get("id")).longValue()); u.setName((String) row.get("name")); return Result.ok(u); } // ✅ 新增用户:/user/add?name=tom @GetMapping("/add") public Result<Long> addUser(@RequestParam String name) { String sql = "INSERT INTO users(name) VALUES (?)"; jdbcTemplate.update(sql, name); // 取最后插入的自增 id(对 MySQL 有效) Long id = jdbcTemplate.queryForObject("SELECT LAST_INSERT_ID()", Long.class); return Result.ok(id); } }

一、项目背景(最小可复现场景)

这是一个最简单的 Spring Boot Web 项目:

  • Web 框架:Spring Boot

  • Web 端口:8080

  • 数据库:MySQL(3306

  • 表:users

目前对外只暴露两个接口

  • GET /user/get?id=

  • GET /user/add?name=

这类结构在学习项目、小工具、内部系统中非常常见,但也正因为“简单”,攻击面反而更清晰

二、攻击面地图(Attack Surface Map)

先不谈漏洞,先谈攻击面在哪里

HTTP 请求

Controller(/user/get, /user/add) ← 攻击入口

JdbcTemplate / SQL ← 高风险区

MySQL users 表 ← 核心资产

攻击面拆解(√ / ×)

  • Controller
    所有 HTTP 参数都是不可信输入

  • SQL 执行层
    一旦输入进入 SQL 语法层,就可能产生注入、越权等问题

  • 数据库
    数据完整性、可用性是最终目标

  • ×浏览器报错/500 页面
    只是症状,不是根因

三、接口级风险分析

1️⃣/user/add?name=xxx

功能:
users表插入一条记录,并返回自增 id。

攻击面与风险
  • 参数入口name

  • 潜在风险

    • SQL 注入(如果使用字符串拼接)

    • 脏数据(超长、异常字符)

    • 错误信息泄露(SQL 异常直接返回)

当前实现的安全点(√)
String sql = "INSERT INTO users(name) VALUES (?)"; jdbcTemplate.update(sql, name);
  • 使用参数化查询

  • 用户输入只作为“数据”,不会进入 SQL 语法层

  • 能天然防御 SQL 注入

✅ 这是正确、安全、推荐的写法(说人话就是把用户输入当字符串,不去执行

2️⃣/user/get?id=1

功能:
根据 id 查询用户。

攻击面与风险(重点)
  • ID 枚举风险

    • id=1,2,3...天然可猜

  • 潜在 IDOR(越权)

    • 如果未来加入登录系统,而这里不校验“是否有权限看这个 id”

  • 信息泄露

    • SQL 报错会暴露表名、字段名

这类问题在真实 Web 攻击中非常常见,而且往往不是“技术高深”,而是“设计疏忽”。

四、一次真实遇到的问题:500 错误从何而来?

在访问/user/get?id=1时,接口返回500 Internal Server Error

日志核心信息是:

java.sql.SQLSyntaxErrorException: Table 'demo_db.users' doesn't exist

错误链路复盘

HTTP 请求 → Controller 正常接收 → SQL 正常执行 → MySQL 抛异常(表不存在) → Spring 包装成 500

⚠️关键点
这不是 Web 层的问题,也不是 Controller 写错,而是:

数据库结构 ≠ 应用假设的结构

五、根因定位:数据库结构问题,而非代码问题

进一步检查数据库:

USE demo_db; SHOW TABLES;

发现:

  • users表不存在,或结构不完整

  • 即使存在,也可能缺少AUTO_INCREMENT

后续又遇到的错误(典型)

Field 'id' doesn't have a default value

这说明:

  • 表中id字段既不是自增

  • 又被设为NOT NULL

  • 应用层没有传 id → 数据库拒绝

翻译成人话就是就只建了库,里面啥也没有,然后建了库以后又忘了把name设置成必须要有,id设置成自增(可以没有输入进去,没有的话就在上一个的id基础上加1)

六、修复方案(也是防御加固)

1️⃣ 正确设置自增主键

ALTER TABLE users MODIFY id INT NOT NULL AUTO_INCREMENT;

含义是:

  • 当 INSERT 不提供 id

  • 数据库自动生成唯一 id

  • 应用不需要“猜”或“管理”主键

2️⃣ 安全收益(不仅是功能修复)

  • ✅ 防止因主键问题导致的 500

  • ✅ 降低逻辑复杂度

  • ✅ 避免开发者在应用层“手写 id”

  • ✅ 更符合数据库安全与一致性原则

七、从安全角度总结这次实践

核心模型(非常重要)

Controller 是攻击入口,SQL 是高风险区,数据库是资产。

这次实践中学到的 3 个安全结论

  1. 500 错误 ≠ 程序崩溃
    很多时候是数据结构或假设错误

  2. 参数化查询是必须的,不是“最佳实践可选项”

  3. 攻击者和开发者看到的是同一套错误信息

    • 你能靠异常定位问题

    • 攻击者也能靠异常推断表结构


八、后续加固方向

  • name做长度与字符校验

  • id做范围校验

  • 错误信息对外统一为业务错误

  • 日志中保留详细异常,前端不暴露

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 18:10:14

OpenCV非真实感渲染:AI艺术滤镜核心技术

OpenCV非真实感渲染&#xff1a;AI艺术滤镜核心技术 1. 技术背景与核心价值 随着AI生成艺术的兴起&#xff0c;图像风格迁移已成为视觉内容创作的重要工具。然而&#xff0c;大多数方案依赖深度学习模型&#xff08;如StyleGAN、Neural Style Transfer&#xff09;&#xff0…

作者头像 李华
网站建设 2026/4/23 20:52:31

PaddlePaddle-v3.3快速部署:一键启动JupyterLab开发环境

PaddlePaddle-v3.3快速部署&#xff1a;一键启动JupyterLab开发环境 1. 背景与价值 深度学习技术的快速发展对开发环境的搭建效率提出了更高要求。传统方式中&#xff0c;配置深度学习框架常面临依赖冲突、版本不兼容、环境调试耗时等问题&#xff0c;尤其对于初学者或需要快…

作者头像 李华
网站建设 2026/4/25 13:20:27

Qwen-VL与TurboDiffusion集成:图文生成视频联合部署教程

Qwen-VL与TurboDiffusion集成&#xff1a;图文生成视频联合部署教程 1. 引言 1.1 业务场景描述 随着AIGC技术的快速发展&#xff0c;图文到视频的自动化生成已成为内容创作领域的重要需求。传统视频制作流程复杂、成本高昂&#xff0c;而基于大模型的文生视频&#xff08;T2…

作者头像 李华
网站建设 2026/4/23 17:15:08

基于STM32的RS485和RS232通信项目应用

手把手教你用STM32搞定RS485与RS232通信&#xff1a;从原理到实战的完整闭环你有没有遇到过这样的场景&#xff1f;现场布线已经完成&#xff0c;设备通电后却发现通信不稳定、数据乱码频发&#xff1b;或者多个传感器挂在同一根总线上&#xff0c;一启动就“抢话”&#xff0c…

作者头像 李华
网站建设 2026/4/12 0:53:58

TensorFlow-v2.9入门必看:变量、张量与计算图基础解析

TensorFlow-v2.9入门必看&#xff1a;变量、张量与计算图基础解析 1. 引言&#xff1a;TensorFlow 2.9 的核心价值与学习目标 TensorFlow 是由 Google Brain 团队开发的开源机器学习框架&#xff0c;广泛应用于深度学习研究和生产环境。它提供了一个灵活的平台&#xff0c;用…

作者头像 李华
网站建设 2026/4/29 19:04:36

FSMN VAD功能测评:小模型大作用,检测效率实测

FSMN VAD功能测评&#xff1a;小模型大作用&#xff0c;检测效率实测 1. 引言 在语音处理系统中&#xff0c;语音活动检测&#xff08;Voice Activity Detection, VAD&#xff09;是不可或缺的前置模块。其核心任务是从连续音频流中准确识别出语音片段的起止时间&#xff0c;…

作者头像 李华