mirror of
https://github.com/qaiu/netdisk-fast-download.git
synced 2025-12-17 12:53:02 +00:00
183 lines
4.0 KiB
Markdown
183 lines
4.0 KiB
Markdown
# 🧪 DoS漏洞修复测试指南
|
||
|
||
## 快速测试
|
||
|
||
### 启动服务
|
||
```bash
|
||
cd /Users/q/IdeaProjects/mycode/netdisk-fast-download
|
||
./bin/run.sh
|
||
```
|
||
|
||
### 使用测试文件
|
||
```
|
||
web-service/src/test/resources/playground-dos-tests.http
|
||
```
|
||
|
||
---
|
||
|
||
## 测试场景
|
||
|
||
### ✅ 测试1: 正常执行
|
||
**预期**:成功返回结果
|
||
|
||
### ⚠️ 测试2: 代码长度超限
|
||
**预期**:立即返回错误 "代码长度超过限制"
|
||
|
||
### 🔥 测试3: 无限循环(重点)
|
||
**代码**:
|
||
```javascript
|
||
while(true) {
|
||
var x = 1 + 1;
|
||
}
|
||
```
|
||
|
||
**v2优化后的预期行为**:
|
||
1. ✅ 前端检测到 `while(true)` 弹出警告对话框
|
||
2. ✅ 用户确认后开始执行
|
||
3. ✅ 30秒后返回超时错误
|
||
4. ✅ 日志只输出一次超时错误
|
||
5. ✅ **不再持续输出BlockedThreadChecker警告**
|
||
6. ✅ 可以立即执行下一个测试
|
||
|
||
**v1的问题行为(已修复)**:
|
||
- ❌ 日志每秒输出BlockedThreadChecker警告
|
||
- ❌ 日志持续滚动,难以追踪其他问题
|
||
- ❌ Worker线程被永久占用
|
||
|
||
### 🔥 测试4: 内存炸弹
|
||
**预期**:30秒超时或OutOfMemoryError
|
||
|
||
### 🔥 测试5: 递归炸弹
|
||
**预期**:捕获StackOverflowError
|
||
|
||
---
|
||
|
||
## 日志对比
|
||
|
||
### v1(问题版本)
|
||
```
|
||
2025-11-29 16:30:41.607 WARN -> Thread blocked for 60249 ms
|
||
2025-11-29 16:30:42.588 WARN -> Thread blocked for 61250 ms
|
||
2025-11-29 16:30:43.593 WARN -> Thread blocked for 62251 ms
|
||
2025-11-29 16:30:44.599 WARN -> Thread blocked for 63252 ms
|
||
... (持续输出)
|
||
```
|
||
|
||
### v2(优化版本)
|
||
```
|
||
2025-11-29 16:45:00.000 INFO -> 开始执行parse方法
|
||
2025-11-29 16:45:30.000 ERROR -> JavaScript执行超时(超过30秒),可能存在无限循环
|
||
2025-11-29 16:45:30.010 DEBUG -> 临时WorkerExecutor已关闭
|
||
... (不再输出BlockedThreadChecker警告)
|
||
```
|
||
|
||
---
|
||
|
||
## 前端体验
|
||
|
||
### 危险代码警告
|
||
|
||
当代码包含以下模式时:
|
||
- `while(true)`
|
||
- `for(;;)`
|
||
- `for(var i=0; true;...)`
|
||
|
||
会弹出对话框:
|
||
```
|
||
⚠️ 检测到 while(true) 无限循环
|
||
|
||
这可能导致脚本无法停止并占用服务器资源。
|
||
|
||
建议修改代码,添加合理的循环退出条件。
|
||
|
||
确定要继续执行吗?
|
||
|
||
[取消] [我知道风险,继续执行]
|
||
```
|
||
|
||
---
|
||
|
||
## 验证清单
|
||
|
||
### 功能验证
|
||
- [ ] 正常代码可以执行
|
||
- [ ] 超过128KB的代码被拒绝
|
||
- [ ] 无限循环30秒后超时
|
||
- [ ] 前端弹出危险代码警告
|
||
- [ ] 超时后可以立即执行新测试
|
||
|
||
### 日志验证
|
||
- [ ] 超时只输出一次错误
|
||
- [ ] 不再持续输出BlockedThreadChecker警告
|
||
- [ ] 临时WorkerExecutor成功关闭
|
||
|
||
### 性能验证
|
||
- [ ] 正常请求响应时间正常
|
||
- [ ] 多次无限循环攻击不影响新请求
|
||
- [ ] 内存使用稳定
|
||
|
||
---
|
||
|
||
## 故障排查
|
||
|
||
### 问题:日志仍在滚动
|
||
**可能原因**:使用的是旧版本代码
|
||
**解决方案**:
|
||
```bash
|
||
mvn clean install -DskipTests
|
||
./bin/stop.sh
|
||
./bin/run.sh
|
||
```
|
||
|
||
### 问题:超时时间太短/太长
|
||
**调整方法**:修改 `JsPlaygroundExecutor.java`
|
||
```java
|
||
private static final long EXECUTION_TIMEOUT_SECONDS = 30; // 改为需要的秒数
|
||
```
|
||
|
||
### 问题:前端检测太敏感
|
||
**调整方法**:修改 `Playground.vue` 中的 `dangerousPatterns` 数组
|
||
|
||
---
|
||
|
||
## 监控命令
|
||
|
||
### 监控超时事件
|
||
```bash
|
||
tail -f logs/*/run.log | grep "JavaScript执行超时"
|
||
```
|
||
|
||
### 监控临时Executor创建
|
||
```bash
|
||
tail -f logs/*/run.log | grep "playground-temp-"
|
||
```
|
||
|
||
### 监控是否还有BlockedThreadChecker警告
|
||
```bash
|
||
tail -f logs/*/run.log | grep "Thread blocked"
|
||
# v2版本:执行超时测试时,应该不再持续输出
|
||
```
|
||
|
||
---
|
||
|
||
## 成功标志
|
||
|
||
### ✅ 修复成功的表现
|
||
1. 超时错误立即返回给用户(30秒)
|
||
2. 日志只输出一次错误
|
||
3. BlockedThreadChecker警告不再持续输出
|
||
4. 可以立即执行下一个测试
|
||
5. 服务保持稳定
|
||
|
||
### ❌ 修复失败的表现
|
||
1. 日志持续每秒输出警告
|
||
2. 无法执行新测试
|
||
3. 服务响应缓慢
|
||
|
||
---
|
||
|
||
**测试文件**: `web-service/src/test/resources/playground-dos-tests.http`
|
||
**重点测试**: 测试3 - 无限循环
|
||
**成功标志**: 日志不再持续滚动 ✅
|
||
|