CodeReview/backend/app/services/agent/knowledge/frameworks/fastapi.py

110 lines
2.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
FastAPI 框架安全知识
"""
from ..base import KnowledgeDocument, KnowledgeCategory
FASTAPI_SECURITY = KnowledgeDocument(
id="framework_fastapi",
title="FastAPI Security",
category=KnowledgeCategory.FRAMEWORK,
tags=["fastapi", "python", "api", "async", "pydantic"],
content="""
FastAPI 是一个现代Python Web框架内置了许多安全特性但仍需注意一些常见问题。
## 安全特性
1. Pydantic自动数据验证
2. 自动生成OpenAPI文档
3. 内置OAuth2/JWT支持
4. 依赖注入系统
## 常见漏洞模式
### SQL注入
```python
# 危险 - 原始SQL
@app.get("/users")
async def get_users(name: str):
query = f"SELECT * FROM users WHERE name = '{name}'"
return await database.fetch_all(query)
# 安全 - 参数化查询
@app.get("/users")
async def get_users(name: str):
query = "SELECT * FROM users WHERE name = :name"
return await database.fetch_all(query, {"name": name})
```
### IDOR
```python
# 危险 - 无权限检查
@app.get("/users/{user_id}")
async def get_user(user_id: int):
return await User.get(user_id)
# 安全 - 验证权限
@app.get("/users/{user_id}")
async def get_user(user_id: int, current_user: User = Depends(get_current_user)):
if user_id != current_user.id and not current_user.is_admin:
raise HTTPException(status_code=403)
return await User.get(user_id)
```
### 路径遍历
```python
# 危险
@app.get("/files/{filename}")
async def get_file(filename: str):
return FileResponse(f"/uploads/{filename}")
# 安全 - 验证路径
@app.get("/files/{filename}")
async def get_file(filename: str):
safe_path = Path("/uploads").resolve() / filename
if not str(safe_path.resolve()).startswith(str(Path("/uploads").resolve())):
raise HTTPException(status_code=400)
return FileResponse(safe_path)
```
### JWT配置问题
```python
# 危险 - 弱密钥
SECRET_KEY = "secret"
# 危险 - 不验证签名
jwt.decode(token, options={"verify_signature": False})
# 安全
SECRET_KEY = os.environ.get("JWT_SECRET_KEY")
jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
```
### CORS配置
```python
# 危险 - 允许所有来源
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True, # 危险组合!
)
# 安全 - 指定来源
app.add_middleware(
CORSMiddleware,
allow_origins=["https://example.com"],
allow_credentials=True,
)
```
## 安全检查清单
1. 所有端点是否有适当的认证
2. 是否使用Depends进行权限检查
3. 文件操作是否验证路径
4. SQL查询是否参数化
5. CORS配置是否合理
6. JWT密钥是否安全存储
7. 敏感数据是否在响应中暴露
""",
)