Web 应用安全清单:OWASP Top 10 防御实战

Lisa Tan | 2026-08-26T23:01:34 | Security

逐条解读 OWASP 2021 Top 10 安全风险,给出 Spring Boot 和 Node.js 项目的具体防御代码示例。

# Web 应用安全清单:OWASP Top 10 防御实战 ## A01 - 访问控制失效 ```java // Spring Security - 方法级权限控制 @PreAuthorize("hasRole('ADMIN') or #userId == authentication.principal.id") @GetMapping("/users/{userId}/profile") public UserProfile getProfile(@PathVariable Long userId) { return userService.getProfile(userId); } ``` 核心原则:默认拒绝(deny by default),每个接口明确声明权限。 ## A02 - 加密失败 ```java // 使用 BCrypt 哈希密码(不要用 MD5/SHA1) String hashed = BCrypt.hashpw(rawPassword, BCrypt.gensalt(12)); // AES-256-GCM 加密敏感数据 Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); cipher.init(Cipher.ENCRYPT_MODE, secretKey, new GCMParameterSpec(128, iv)); byte[] encrypted = cipher.doFinal(plaintext); ``` ## A03 - 注入攻击 ```java // 使用参数化查询(MyBatis) @Select("SELECT * FROM users WHERE email = #{email}") User findByEmail(@Param("email") String email); // 绝对不要拼接 SQL // 错误示例:@Select("SELECT * FROM users WHERE email = '" + email + "'") ``` ## A05 - 安全配置错误 ```yaml # Spring Boot 安全头配置 server: servlet: session: cookie: http-only: true secure: true same-site: strict # 禁用不需要的端点 management: endpoints: web: exposure: include: health,info ``` ## A07 - 跨站脚本 (XSS) ```javascript // Node.js - 使用 DOMPurify 清理 HTML const DOMPurify = require('dompurify'); const clean = DOMPurify.sanitize(userInput); // React 默认转义,但 dangerouslySetInnerHTML 除外 // 永远不要: ``` ## A08 - 反序列化漏洞 ```java // 使用白名单过滤反序列化类 ObjectInputFilter filter = ObjectInputFilter.Config.createFilter( "my.app.*;!*" ); ObjectInputStream ois = new ObjectInputStream(input); ois.setObjectInputFilter(filter); ``` ## 安全检查清单 - [ ] 所有接口有权限控制 - [ ] 密码使用 BCrypt/Argon2 哈希 - [ ] SQL 全部参数化 - [ ] 输入输出转义 - [ ] HTTPS 强制 - [ ] CORS 白名单 - [ ] 速率限制 - [ ] 安全头完整

← Back to Blog