6.6 KiB
6.6 KiB
混合方案安全性说明
📋 当前实现的安全特性
1️⃣ 核心算法保护 ✅
问题: 如何防止客户端看到核心算法?
解决:
- ✅ 核心计算逻辑在服务器端执行
- ✅ 客户端只能看到输入和输出,看不到计算过程
- ✅ 即使客户端打开开发者工具,也无法获取算法
# 🔒 服务器端(客户端看不到)
def calculate_expression(request):
# 这里的算法逻辑客户端完全看不到
result = eval(expression) # 可以替换成复杂的 AI 模型
return result
2️⃣ 输入验证 ✅
问题: 如何防止恶意输入?
解决:
- ✅ 正则表达式验证:只允许数字和基本运算符
- ✅ 拒绝危险字符和代码注入
# 安全检查
if not re.match(r'^[\d\s\+\-\*\/\(\)\.]+$', expression):
return "非法输入"
可接受: 87-98, 100+200, (10*5)/2
拒绝: __import__('os'), exec('code'), sys.exit()
3️⃣ 详细日志 ✅
功能: 监控所有请求和响应
日志内容:
============================================================
📥 收到计算请求
时间: 2024-12-16 15:30:45
表达式: 87-98
API Key: 未提供(无鉴权模式)
============================================================
🛡️ 安全检查: 验证表达式格式...
✅ 表达式格式验证通过
🔒 开始执行核心算法...
✅ 计算完成: 87-98 = -11
============================================================
📤 返回计算结果
成功: True
表达式: 87-98
结果: -11.0
消息: 计算成功: 87-98 = -11
============================================================
4️⃣ API Key 鉴权(可选)🔐
当前状态: 已准备好,但默认关闭
如何启用 API Key 验证?
步骤 1:在后端取消注释
打开 Server/app/api/v1/jsx_demo.py,取消注释这段代码:
# 取消注释下面这段
if x_api_key not in VALID_API_KEYS:
logger.warning("❌ API Key 验证失败")
raise HTTPException(status_code=403, detail="无效的 API Key")
logger.info("✅ API Key 验证通过")
步骤 2:在前端添加 API Key
打开 Designer/src/api/jsxApi/inline/hybrid-demo.ts:
const response = await fetch(`${config.apiBaseUrl}/jsx_demo/calculate`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': 'demo_key_123' // 添加这行
},
body: JSON.stringify({
expression: layerName
})
});
🔐 安全级别对比
❌ 纯前端方案(不安全)
// 客户端代码(所有人都能看到)
const result = complexAlgorithm(input); // ⚠️ 算法暴露
const jsx = `var layer = doc.artLayers.add(); ...`;
风险:
- ❌ 核心算法完全暴露
- ❌ 可以轻松复制算法
- ❌ 可以绕过任何验证
✅ 混合方案(当前实现)
// 客户端只发送请求
const result = await fetch('/calculate', { expression: '87-98' });
// 只能看到返回的结果,看不到计算过程
优势:
- ✅ 核心算法在服务器,客户端看不到
- ✅ 输入验证防止注入攻击
- ✅ 详细日志监控所有请求
🔐 混合方案 + API Key(高级)
// 客户端需要提供 API Key
const result = await fetch('/calculate', {
headers: { 'X-API-Key': 'your_secret_key' },
body: { expression: '87-98' }
});
优势:
- ✅ 以上所有优势
- ✅ 只有授权客户端可以调用
- ✅ 可以限制每个 Key 的调用次数
- ✅ 可以追踪谁在使用 API
💡 进一步加强建议
1. 加密传输(HTTPS)
# 使用 SSL 证书
uvicorn app.main:app --ssl-keyfile=key.pem --ssl-certfile=cert.pem
2. 限流(Rate Limiting)
from slowapi import Limiter
limiter = Limiter(key_func=get_remote_address)
@limiter.limit("10/minute") # 每分钟最多 10 次请求
@router.post("/calculate")
async def calculate_expression(...):
...
3. IP 白名单
ALLOWED_IPS = {"127.0.0.1", "192.168.1.100"}
@router.post("/calculate")
async def calculate_expression(request: Request):
if request.client.host not in ALLOWED_IPS:
raise HTTPException(403, "IP 未授权")
4. 结果缓存
from functools import lru_cache
@lru_cache(maxsize=1000)
def calculate(expression: str):
# 相同的表达式不重复计算
return eval(expression)
📊 总结
| 特性 | 状态 | 说明 |
|---|---|---|
| 核心算法保护 | ✅ 已实现 | 算法在服务器端,客户端看不到 |
| 输入验证 | ✅ 已实现 | 正则表达式过滤危险输入 |
| 详细日志 | ✅ 已实现 | 记录所有请求和响应 |
| API Key 鉴权 | 🔧 可选 | 默认关闭,取消注释即可启用 |
| HTTPS 加密 | ⚠️ 推荐 | 生产环境必须启用 |
| 限流保护 | ⚠️ 推荐 | 防止恶意刷接口 |
🚀 测试安全性
测试 1:查看网络请求
- 打开浏览器开发者工具(F12)
- 切换到 Network 标签
- 点击"智能配色"按钮
- 查看请求详情
你只能看到:
- ✅ 请求 URL:
/api/v1/jsx_demo/calculate - ✅ 请求参数:
{"expression": "87-98"} - ✅ 响应结果:
{"success": true, "result": -11}
你看不到:
- ❌ 服务器端的计算逻辑
- ❌ 核心算法代码
- ❌ 其他用户的请求
测试 2:尝试注入攻击
尝试创建一个图层,名称为:__import__('os').system('rm -rf /')
预期结果:
- ❌ 被拒绝
- 📝 日志显示:
表达式包含非法字符 - 🛡️ 系统安全
测试 3:查看服务器日志
运行 Demo 后,查看后端控制台输出,应该看到详细的日志:
cd Server
python -m uvicorn app.main:app --reload
日志示例:
2024-12-16 15:30:45 [INFO] ============================================================
2024-12-16 15:30:45 [INFO] 📥 收到计算请求
2024-12-16 15:30:45 [INFO] 时间: 2024-12-16 15:30:45
2024-12-16 15:30:45 [INFO] 表达式: 87-98
2024-12-16 15:30:45 [INFO] API Key: 未提供(无鉴权模式)
...
🎯 最佳实践建议
开发阶段(当前)
- ✅ 无 API Key(方便测试)
- ✅ 详细日志
- ✅ HTTP 即可
生产环境
- 🔐 启用 API Key
- 🔒 启用 HTTPS
- 📊 启用限流
- 📝 日志写入文件
- 🛡️ IP 白名单(可选)
安全性总结:
当前方案已经实现了核心算法保护,客户端无法看到服务器端的计算逻辑。如需进一步加强,可以启用 API Key 验证和其他安全措施。