From: https://baomidou.com/plugins/block-attack/
BlockAttackInnerInterceptor
是 MyBatis-Plus 框架提供的一個安全外掛,專門用於防止惡意的全表更新和刪除操作。該外掛透過攔截 update
和 delete
語句,確保這些操作不會無意中影響到整個資料表,從而保護資料的完整性和安全性。
功能特性
- 阻止全表更新刪除:外掛能夠識別並阻止沒有指定條件的
update
和delete
語句,這些語句可能會導致全表資料被修改或刪除。 - 保護資料安全:透過限制全表操作,減少因誤操作或惡意攻擊導致的資料丟失風險。
使用方法
- 注入外掛:在 Spring Boot 配置類中,透過
@Bean
註解將MybatisPlusInterceptor
注入到 Spring 容器中,並新增BlockAttackInnerInterceptor
作為內部攔截器。
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
return interceptor;
}
}
- 配置攔截規則:外掛預設攔截沒有指定條件的
update
和delete
語句。如果需要自定義攔截規則,可以參考 MyBatis-Plus 的文件進行配置。
測試示例
全表更新測試
以下測試示例展示瞭如何使用 BlockAttackInnerInterceptor
來防止全表更新操作。
@SpringBootTest
public class QueryWrapperTest {
@Autowired
private UserService userService;
/**
* SQL:UPDATE user SET name=?,email=?;
*/
@Test
public void testFullUpdate() {
User user = new User();
user.setId(999L);
user.setName("custom_name");
user.setEmail("xxx@mail.com");
// 由於沒有指定更新條件,外掛將丟擲異常
// com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Prohibition of table update operation
Assertions.assertThrows(MybatisPlusException.class, () -> {
userService.saveOrUpdate(user, null);
});
}
}
部分更新測試
以下測試示例展示瞭如何正確地執行部分更新操作,外掛不會對此類操作進行攔截。
@SpringBootTest
public class QueryWrapperTest {
@Autowired
private UserService userService;
/**
* SQL:UPDATE user SET name=?, email=? WHERE id = ?;
*/
@Test
public void testPartialUpdate() {
LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(User::getId, 1);
User user = new User();
user.setId(10L);
user.setName("custom_name");
user.setEmail("xxx@mail.com");
// 由於指定了更新條件,外掛不會攔截此操作
userService.saveOrUpdate(user, wrapper);
}
}
注意
- 合理配置:確保在配置外掛時,考慮到專案的實際需求,避免過度限制導致正常操作受阻。
- 測試驗證:在生產環境部署前,應充分測試外掛的功能,確保其按預期工作。
BlockAttackInnerInterceptor
外掛是 MyBatis-Plus 提供的一個重要的安全工具,它能夠有效地防止全表更新和刪除操作,保護資料庫免受意外或惡意的資料破壞。透過合理配置和使用該外掛,可以顯著提高應用程式的資料安全性。