---
title: "A01:2025 - 失效的访问控制"
weight: 1
date: "2026-03-10T11:26:47+08:00"
lastmod: "2026-03-24T16:29:46+08:00"
---

💡 **学习提示**: 本文档介绍 OWASP Top 10 A01 - 失效的访问控制，这是 2025 年排名第一的 Web 应用安全风险。

⚠️ **法律声明**: 本文档仅供学习和授权测试使用。

---

## 📋 风险概述

**失效的访问控制 (Broken Access Control)** 是指攻击者能够绕过系统的访问控制机制，访问未授权的功能或数据。这是 OWASP Top 10:2025 中排名第一的安全风险。

### 🔴 危害等级：严重

| 项目 | 说明 |
|------|------|
| **发生率** | 3.81% (最高) |
| **平均影响** | 7.81/10 |
| **最大影响** | 9.67/10 |
| **漏洞数量** | 318,433 |

---

## 🎯 常见场景

### 1. 越权访问 (Privilege Escalation)

```
普通用户 → 访问管理员功能
用户 A → 访问用户 B 的数据
```

### 2. 目录遍历 (Path Traversal)

```bash
# 攻击示例
GET /files?name=../../../etc/passwd
GET /download?file=....//....//config.ini
```

### 3. 未授权的 API 调用

```bash
# 未验证权限直接调用 API
DELETE /api/users/123
PUT /api/admin/settings
```

### 4. 前端访问控制

```javascript
// ❌ 错误：仅在前端隐藏，未在后端验证
if (user.role === 'admin') {
  showAdminButton();
}
// 攻击者可直接调用 API
```

---

## ⚠️ 典型漏洞

### 漏洞 1: IDOR (不安全的直接对象引用)

```
# 攻击者修改 URL 中的 ID 访问他人数据
https://example.com/account/123  → 自己的账户
https://example.com/account/124  → 他人的账户 ❌
```

### 漏洞 2: 缺少权限检查

```python
# ❌ 错误示例
@app.route('/admin/delete_user/<user_id>')
def delete_user(user_id):
    # 未检查当前用户是否为管理员
    db.delete_user(user_id)
    return "Deleted"
```

### 漏洞 3: 硬编码访问控制

```python
# ❌ 错误：依赖客户端传来的角色
role = request.json.get('role')  # 可被篡改
if role == 'admin':
    grant_admin_access()
```

---

## 🛡️ 防御方法

### ✅ 1. 实施最小权限原则

```python
# ✅ 正确：基于角色的访问控制
@require_role('admin')
def delete_user(user_id):
    db.delete_user(user_id)
```

### ✅ 2. 服务端验证

```python
# ✅ 正确：在服务端验证权限
def get_account(user_id, current_user):
    if current_user.id != user_id and not current_user.is_admin:
        raise PermissionDenied()
    return db.get_account(user_id)
```

### ✅ 3. 使用安全的框架

```python
# ✅ 使用 Django 的权限系统
from django.contrib.auth.decorators import permission_required

@permission_required('accounts.delete_user')
def delete_user_view(request, user_id):
    ...
```

### ✅ 4. 记录访问控制失败

```python
# ✅ 记录未授权访问尝试
if not user.has_permission('delete'):
    log_security_event(f"Unauthorized delete attempt by {user.id}")
    raise PermissionDenied()
```

---

## 🧪 测试方法

### 手动测试

1. **越权测试**
   - 使用普通用户账户登录
   - 尝试访问管理员 URL
   - 修改请求参数访问其他用户数据

2. **HTTP 方法测试**

   ```bash
   # 尝试未授权的 HTTP 方法
   curl -X DELETE /api/users/123
   curl -X PUT /api/admin/settings
   ```

3. **目录遍历测试**

   ```bash
   curl "https://target.com/files?name=../../../etc/passwd"
   ```

### 自动化测试

```bash
# 使用 OWASP ZAP 扫描
zap-baseline.py -t https://target.com

# 使用 Burp Suite 进行授权测试
```

---

## 📊 影响评估

### 业务影响

- **数据泄露**: 未授权访问敏感数据
- **功能滥用**: 执行未授权操作
- **合规风险**: 违反 GDPR、等保等法规

### 技术影响

- 系统完整性受损
- 用户信任度下降
- 可能导致进一步攻击

---

## 🎓 学习资源

### 推荐阅读

- [OWASP Access Control Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Access_Control_Cheat_Sheet.html)
- [OWASP Authorization Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Cheat_Sheet.html)

### 实践练习

- OWASP Juice Shop - 访问控制挑战
- PortSwigger Web Security Academy - 访问控制实验室

---

## 🔗 参考资料

- **OWASP Top 10:2025 A01**: <https://owasp.org/Top10/A01_2025-Broken_Access_Control/>
- **OWASP Top 10 GitHub**: <https://github.com/OWASP/www-project-top-ten>
