Skip to content

Security Protection Plugin

对应模块: io.gitee.lcgyl:lcgyl-security-protection-plugin

Web 安全防护增强模块,防御常见网络攻击。

✨ 特性

  • XSS 防护 - 自动过滤输入中的恶意脚本
  • CSRF 防护 - Token 验证机制
  • SQL 注入防护 - 敏感字符检测
  • IP 黑白名单 - 访问控制列表
  • 请求频率限制 - 防止暴力破解

🚀 快速开始

依赖引入

gradle
implementation 'io.gitee.lcgyl:lcgyl-security-protection-plugin:2.2.0'

配置

yaml
lcgyl:
  security:
    protection:
      # XSS 防护
      xss:
        enabled: true
        mode: ESCAPE  # ESCAPE, CLEAN, REJECT
        exclude-paths:
          - /api/admin/content/**
      
      # CSRF 防护
      csrf:
        enabled: true
        token-header: X-CSRF-TOKEN
        cookie-name: CSRF-TOKEN
        exclude-paths:
          - /api/public/**
      
      # SQL 注入防护
      sql-injection:
        enabled: true
        action: REJECT  # REJECT, LOG
      
      # IP 访问控制
      ip-filter:
        enabled: true
        whitelist:
          - 192.168.1.0/24
        blacklist:
          - 10.0.0.100

XSS 防护

java
@RestController
@RequestMapping("/api/posts")
public class PostController {
    
    // 全局 XSS 防护自动生效
    @PostMapping
    public Post createPost(@RequestBody @XssClean CreatePostRequest request) {
        // request.getContent() 已自动清理 XSS 内容
        return postService.create(request);
    }
    
    // 跳过 XSS 检查(富文本编辑器场景)
    @PostMapping("/rich-content")
    @XssIgnore
    public Post createRichPost(@RequestBody CreatePostRequest request) {
        // 不过滤 XSS,需自行处理
        return postService.create(request);
    }
}

CSRF 防护

java
// 前端获取 CSRF Token
@GetMapping("/csrf-token")
public Map<String, String> getCsrfToken(HttpServletRequest request) {
    CsrfToken token = (CsrfToken) request.getAttribute(CsrfToken.class.getName());
    return Map.of("token", token.getToken());
}

// 前端请求时携带 Token
// fetch('/api/users', {
//     method: 'POST',
//     headers: {
//         'X-CSRF-TOKEN': csrfToken
//     },
//     body: JSON.stringify(data)
// })

SQL 注入防护

java
@Service
public class SearchService {
    
    @Inject
    private SqlInjectionDetector detector;
    
    public List<User> search(String keyword) {
        // 手动检测(自动检测已在 Filter 层完成)
        if (detector.containsSqlInjection(keyword)) {
            throw new SecurityException("检测到 SQL 注入攻击");
        }
        return userRepository.searchByKeyword(keyword);
    }
}

IP 黑白名单

java
@Service
public class IpFilterService {
    
    @Inject
    private IpAccessController ipController;
    
    // 动态添加黑名单
    public void blockIp(String ip, Duration duration) {
        ipController.addToBlacklist(ip, duration);
    }
    
    // 动态添加白名单
    public void allowIp(String ip) {
        ipController.addToWhitelist(ip);
    }
    
    // 检查 IP 是否被允许
    public boolean isAllowed(String ip) {
        return ipController.isAllowed(ip);
    }
}

安全响应头

yaml
lcgyl:
  security:
    protection:
      headers:
        enabled: true
        content-security-policy: "default-src 'self'"
        x-frame-options: DENY
        x-content-type-options: nosniff
        x-xss-protection: "1; mode=block"
        strict-transport-security: "max-age=31536000; includeSubDomains"

Released under the Apache License 2.0