最后更新:2026-04-17
OWASP Top 10 是由开放 Web 应用安全项目(OWASP)发布的 Web 应用安全风险 Top 10 排名,代表了当前最常见和最严重的 Web 应用安全风险。
| 排名 | 编号 | 名称 | 说明 |
|---|---|---|---|
| 1 | A01:2025 | Broken Access Control | 访问控制失效 |
| 2 | A02:2025 | Security Misconfiguration | 安全配置错误 |
| 3 | A03:2025 | Software Supply Chain Failures | 软件供应链失效 |
| 4 | A04:2025 | Cryptographic Failures | 加密机制失效 |
| 5 | A05:2025 | Injection | 注入攻击 |
| 6 | A06:2025 | Insecure Design | 不安全设计 |
| 7 | A07:2025 | Authentication Failures | 身份认证失效 |
| 8 | A08:2025 | Software or Data Integrity Failures | 软件/数据完整性失效 |
| 9 | A09:2025 | Security Logging and Alerting Failures | 安全日志与告警失效 |
| 10 | A10:2025 | Mishandling of Exceptional Conditions | 异常条件处理不当 |
访问控制失效是指系统未能正确实施对认证用户的权限限制,导致用户可以越权访问资源或执行操作。
// 漏洞代码:未校验用户是否有权限访问该订单
@GetMapping("/order/{id}")
public Order getOrder(@PathVariable Long id) {
return orderRepository.findById(id);
}
// 安全代码:校验当前用户是否有权限
@GetMapping("/order/{id}")
public Order getOrder(@PathVariable Long id, Principal principal) {
Order order = orderRepository.findById(id);
if (!order.getOwner().equals(principal.getName())) {
throw new AccessDeniedException("无权访问此订单");
}
return order;
}
安全配置错误是最常见的安全问题之一,通常由于不安全的默认配置、不完整的配置、开放的存储、错误的 HTTP 头部配置等导致。
# 漏洞配置:生产环境开启调试模式
spring:
profiles:
active: dev
devtools:
add-properties: false
# 安全配置:生产环境配置
spring:
profiles:
active: prod
devtools:
restart:
enabled: false
// 漏洞代码:禁用 SSL 证书验证
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) {}
public void checkServerTrusted(X509Certificate[] chain, String authType) {}
public X509Certificate[] getAcceptedIssuers() { return null; }
}
};
软件供应链失效是指在使用第三方组件、库或服务时引入的安全风险,包括使用含有已知漏洞的依赖、未经授权的依赖更新等。
<!-- 漏洞配置:使用含有漏洞的版本 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version> <!-- 存在 CVE-2021-44228 -->
</dependency>
<!-- 安全配置:使用修复后的版本 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.24.3</version>
</dependency>
加密机制失效(原 A02:2017 Sensitive Data Exposure)涉及敏感数据的保护不足,包括传输中和存储中的数据。
// 漏洞代码:使用 MD5 存储密码
public String hashPassword(String password) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
return new String(md.digest(password.getBytes()));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// 安全代码:使用 BCrypt 加密
public String hashPassword(String password) {
return BCrypt.hashpw(password, BCrypt.gensalt(12));
}
注入攻击是指用户输入被解释为代码执行,包括 SQL 注入、XSS、命令注入等。
// 漏洞代码:SQL 拼接
public User findByUsername(String username) {
String sql = "SELECT * FROM users WHERE username = '" + username + "'";
return jdbcTemplate.queryForObject(sql, User.class);
}
// 安全代码:参数化查询
public User findByUsername(String username) {
String sql = "SELECT * FROM users WHERE username = ?";
return jdbcTemplate.queryForObject(sql, User.class, username);
}
不安全设计是指在系统设计阶段未能考虑安全需求,导致架构层面存在安全缺陷。
身份认证失效涉及用户身份验证机制的缺陷,导致攻击者可以冒充合法用户。
// 漏洞代码:无登录失败限制
@PostMapping("/login")
public String login(String username, String password) {
if (userService.authenticate(username, password)) {
return "redirect:/home";
}
return "login?error=1";
}
// 安全代码:登录失败限制
@PostMapping("/login")
public String login(String username, String password) {
if (rateLimiter.isBlocked(username)) {
return "login?error=locked";
}
if (userService.authenticate(username, password)) {
rateLimiter.reset(username);
return "redirect:/home";
}
rateLimiter.recordFailure(username);
return "login?error=1";
}
软件/数据完整性失效涉及代码或数据来源未经验证的安全问题,包括反序列化漏洞、CI/CD 管道安全等。
// 漏洞代码:不安全的反序列化
public Object deserialize(byte[] data) {
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data));
return ois.readObject();
}
// 安全代码:白名单反序列化
public Object deserialize(byte[] data) {
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data)) {
@Override
protected Class<?> resolveClass(ObjectStreamClass desc) {
if (!ALLOWED_CLASSES.contains(desc.getName())) {
throw new InvalidClassException("Unauthorized deserialization attempt", desc.getName());
}
return super.resolveClass(desc);
}
};
return ois.readObject();
}
安全日志与告警失效是指未能正确记录和响应安全事件,导致攻击行为无法被检测和追溯。
异常条件处理不当是指系统在遇到异常情况时未能正确处理,导致安全问题或系统不稳定。