如何利用Spring Security结合SQL防御机制保障数据安全

陌强吖_3364

陌强吖_3364

2026-10-27

362人浏览

原创

Spring Security 不防 SQL 注入,它工作在 Web 层,而 SQL 注入发生在数据访问层;真正有效的防护是:MyBatis 用 #{}、JPA 用命名参数、JDBC 用 PreparedStatement,并最小化数据库权限。

如何利用spring security结合sql防御机制保障数据安全

Spring Security 本身不参与 SQL 注入防护,指望它自动拦截 ' OR '1'='1 这类输入是无效的——它根本不会看到 SQL 语句,更不会解析或改写你的 SELECT 或 INSERT。

Spring Security 和 SQL 防御根本不在同一层

Spring Security 是 HTTP 请求生命周期的守门人,工作在 Web 层(Filter → Servlet → Controller),而 SQL 注入发生在数据访问层(DAO/Repository → JDBC/MyBatis → 数据库)。两者之间隔着至少三层:业务逻辑、ORM 封装、数据库驱动。

常见错误现象包括:

  • 在 @RestController 里用 String.format("WHERE name = '%s'", name) 拼 SQL,再配十个 SecurityFilterChain 也拦不住
  • 以为开启 http.csrf().disable() 或配置了 authorizeHttpRequests 就等于“防注入”
  • 把 Druid 的 wall 防火墙当成万能盾,却忽略其仅对部分语法有效、且默认不启用

真正起作用的只有三件事:

  • MyBatis 中严格使用 #{},禁用 ${}(后者直接字符串替换)
  • JPA @Query 必须用命名参数(:name),绝不用 + 拼接
  • JDBC 原生调用必须走 PreparedStatement,Statement + 字符串拼接是红线

Druid wall 配置能补什么,不能补什么

Druid 的 wall 过滤器是数据库连接池侧的语法级拦截,属于“最后一道辅助防线”,不是替代方案。

它能识别并拒绝明显危险的 SQL 片段,比如:

  • UNION SELECT(除非你明确允许)
  • DELETE FROM user(若配置了 delete-allow: false)
  • DROP TABLE、EXEC xp_cmdshell 等高危指令

但它无法防御:

  • 参数化查询中被绕过的逻辑漏洞(如 WHERE id IN (#{idList}) 中 idList 是用户可控 List,仍可能触发堆叠注入)
  • 动态表名/列名场景(FROM ${tableName}),此时 #{} 失效,必须靠白名单校验
  • 存储过程调用中的参数污染(CALL proc(?) 安全,但 CALL ${procName}(?) 不安全)

示例配置(application.yml):

蓝藻AI
蓝藻AI

蓝藻AI是一款AI音频处理工具,云知声旗下的AI配音和声音克隆平台。

下载
spring:
  datasource:
    druid:
      filters: stat,wall
      wall:
        config:
          select-allow: true
          delete-allow: false
          drop-table-allow: false
          condition-and-allow: true

为什么数据库账号权限最小化比任何代码都管用

哪怕 ORM 层漏了一处 ${},只要数据库账号没有 DROP、ALTER、跨库 SELECT 权限,攻击者最多只能读当前表的几列数据,无法拖库、无法写 shell、无法提权。

真实踩坑点:

  • 开发环境用 root 账号连 MySQL,测试通过就上线,结果某次日志打印把完整 SQL 泄露到 ELK,攻击者顺藤摸瓜构造注入
  • 一个只查用户信息的接口,数据库账号却有 INSERT INTO log_table 权限,被用来盲注回显
  • PostgreSQL 中未限制 pg_read_file() 等高危函数,导致文件读取+SQL注入组合利用

建议按接口粒度分配权限:

  • GET /user/{id} → 只授 SELECT on user 表
  • POST /order → 授 INSERT on order,SELECT on product(只读)
  • 禁用 public schema 的 USAGE,显式指定 schema 名

Spring Security 唯一能协同 SQL 防御的地方:日志与监控闭环

它不拦 SQL,但可以帮你更快发现异常行为。关键不是“防”,而是“感知+响应”。

实操建议:

  • 在 SecurityFilterChain 中记录可疑请求特征:request.getQueryString() 含 UNION、SELECT、单引号连续出现 ≥3 次
  • 结合 Spring AOP,在 DAO 方法执行前记录慢查询或异常 SQL(如 org.springframework.dao.DataIntegrityViolationException 可能暗示注入试探)
  • 将 DataSource 包装为代理,对执行的 SQL 做简单模式匹配(非正则,避免性能损耗),命中即发告警,不阻断

注意:这类检测必须轻量,否则会拖垮高并发接口;也不要试图在 Filter 里重写 SQL——那不是它的职责,也极易引入新 bug。

最常被忽略的一点:SQL 注入的初始入口往往不是业务 API,而是 Actuator 端点、Swagger UI、H2 Console 这类调试接口。它们默认暴露在生产环境,又常被遗忘在安全扫描之外。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

spring security

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4563

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

951

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1189

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6541

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3303

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6500

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

8941

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1210

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1072

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习