blockattackinnerinterceptor 用于拦截无 where 条件的 update/delete 操作,通过检查 wrapper 条件是否为空实现零侵入防护;需在 mybatisplusinterceptor 中显式添加,支持 @interceptorignore 临时绕过。

MyBatis-Plus 的 BlockAttackInnerInterceptor 插件专为开发与测试环境设计,用于实时拦截无 WHERE 条件的 UPDATE 和 DELETE 操作,防止误删/误改全表数据。它不依赖 SQL 解析引擎,而是通过检查 MyBatis-Plus 生成的执行上下文(如 Wrapper 是否为空、条件是否缺失)来判断风险,响应快、零侵入。
启用防全表操作拦截器
需在 Spring Boot 配置类中注册 MybatisPlusInterceptor 并添加 BlockAttackInnerInterceptor:
- 确保已引入
mybatis-plus-extension依赖(3.5.1+ 推荐) - 拦截器必须在
MybatisPlusInterceptor实例中显式添加,不能仅靠 starter 自动装配 - 若同时使用分页、乐观锁等插件,
BlockAttackInnerInterceptor可放在任意顺序,无执行先后依赖
示例配置:
@Configuration<br>public class MybatisPlusConfig {<br> @Bean<br> public MybatisPlusInterceptor mybatisPlusInterceptor() {<br> MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();<br> interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());<br> return interceptor;<br> }<br>}
哪些操作会被拦截
该插件默认拦截以下两类「危险行为」:
-
UPDATE 无有效条件:调用
update(entity, null)或update(entity, new UpdateWrapper()),且 wrapper 中未设置任何查询条件(如eq、in、like等) -
DELETE 无有效条件:调用
remove(null)或remove(new QueryWrapper()),且 wrapper 为空或只含非约束性方法(如select()、last())
注意:它不分析原始 SQL 字符串,而是基于 MyBatis-Plus 的条件构造逻辑判断——所以 lambdaUpdate().set(...).update() 这类无 where 的链式调用也会被拦。
开发调试时临时绕过限制
某些场景(如初始化脚本、管理后台清空测试数据)需要强制执行全表操作,可局部忽略拦截:
- 在 Mapper 接口方法上添加
@InterceptorIgnore(blockAttack = "true") - 或在 Service 层调用时,通过
MetaObjectHandler或自定义注解 + AOP 动态控制(需自行扩展) - 不建议关闭全局拦截器,避免遗漏风险
验证拦截是否生效
写一个简单单元测试即可确认:
- 调用
userMapper.delete(null)→ 应抛出MybatisPlusException: Prohibition of full table deletion - 调用
userMapper.update(user, new LambdaUpdateWrapper().eq(User::getId, 1))→ 正常执行,SQL 含 WHERE - 日志级别设为 DEBUG 时,可在控制台看到拦截器触发提示(如 “BlockAttack detected unsafe update without condition”)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











