js演练场漏洞修复

This commit is contained in:
q
2025-11-30 02:07:56 +08:00
parent 49b8501e86
commit f750aa68e8
9 changed files with 1198 additions and 19 deletions

View File

@@ -0,0 +1,182 @@
# 🧪 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 - 无限循环
**成功标志**: 日志不再持续滚动 ✅