chore(配置安全): 本机真实值改用 Windows 用户环境变量(不落文件),start-dev.ps1 加注册表兜底;清理仓库内历史明文 key + 文档补充
4个文件已修改
63 ■■■■■ 已修改文件
docs/功能测试报告/功能测试报告_密钥外部化与打包去密_2026-09-26.md 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/工作日结/工作日结_2026-09-26.md 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/打包部署说明.md 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
start-dev.ps1 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_ÃÜÔ¿Íⲿ»¯Óë´ò°üÈ¥ÃÜ_2026-09-26.md
@@ -44,3 +44,31 @@
## äº”、结论
配置分层改造完成并通过 7 æ¡ç”¨ä¾‹ï¼šè¿› jar çš„只有占位符,真实值仅存在于本机未跟踪文件或环境变量;本机开发与线上部署行为均未退化。轮换 key çš„æ­¥éª¤å·²å†™å…¥éƒ¨ç½²è¯´æ˜Žã€‚
## å…­ã€ç¬¬äºŒè½®ï¼ˆåŒæ—¥æ™šï¼Œç”¨æˆ·åŒæ„åŽè¿½åŠ ï¼‰ï¼šæœ¬æœºä¹Ÿä¸ç•™æ˜Žæ–‡
1. **本机真实值改为 Windows ç”¨æˆ·çŽ¯å¢ƒå˜é‡**(不再落文件):
   ```powershell
   setx TRAFFIC_DB_PASSWORD "本机 MySQL å£ä»¤"
   setx DEEPSEEK_API_KEY   "DeepSeek key"
   ```
   `traffic-audit-server/config/application.yml` æ”¹æˆ"只有说明、无明文"的注释文件(值全部由环境变量提供)。
2. **start-dev.ps1 åŠ æ³¨å†Œè¡¨å…œåº•**:若当前 shell æ˜¯æ—§è¿›ç¨‹ã€æ‹¿ä¸åˆ°æ–°è®¾å˜é‡ï¼Œåˆ™ä»Ž `HKCU\Environment` è¯»å–并注入后端进程,避免"文件里没有、环境变量也读不到"的空档。
3. **清理仓库内含 key çš„历史文件**(未跟踪/已忽略,非提交内容):
   | æ–‡ä»¶ | å‘½ä¸­ |
   | --- | --- |
   | `_shots/all_events.json` | 13 å¤„ |
   | `_dep_readme.txt` | 1 å¤„ |
   â†’ å…¨éƒ¨æ›¿æ¢ä¸º `sk-REDACTED`,复查全仓库**已无明文 key**。
### è¿½åŠ ç”¨ä¾‹
| ç¼–号 | è¾“å…¥ | é¢„期 | å®žé™… | ç»“论 |
| --- | --- | --- | --- | --- |
| TC-8 | `start-dev.ps1`(在未继承新变量的 shell é‡Œï¼‰ | è‡ªåŠ¨ä»Žæ³¨å†Œè¡¨è½½å…¥ | è¾“出"已从用户环境变量载入 TRAFFIC_DB_PASSWORD / DEEPSEEK_API_KEY" | é€šè¿‡ |
| TC-9 | å¯åŠ¨åŽç™»å½• `admin/123456` | åº“口令取自环境变量 | ç™»å½•成功、token 156 å­—符 | é€šè¿‡ |
| TC-10 | `POST /api/llm/chat` | key å–自环境变量 | HTTP 200、回答"收到" | é€šè¿‡ |
| TC-11 | å…¨ä»“库扫描 `sk-[A-Za-z0-9]{16,}` | æ— æ˜Žæ–‡ | æ¸…理后复查为 0 | é€šè¿‡ |
| TC-12 | `traffic-audit-server/config/application.yml` | æ— æ˜Žæ–‡ | ä»…注释说明(值走环境变量) | é€šè¿‡ |
> è¯´æ˜Žï¼šçŽ¯å¢ƒå˜é‡æœ¬èº«ä»æ˜¯æœ¬æœºæ˜Žæ–‡ï¼ˆå­˜åœ¨æ³¨å†Œè¡¨ `HKCU\Environment`),适合单机开发;协作/生产请用部署机外部配置或密钥管理工具。轮换 key ä»æ˜¯æ ¹æ²»æ³„露的唯一手段。
docs/¹¤×÷ÈÕ½á/¹¤×÷ÈÕ½á_2026-09-26.md
@@ -21,13 +21,20 @@
- åŽç«¯å¯åЍ OK;登录成功(证明库口令取自本机覆盖文件,否则占位符空口令连不上);`/api/llm/chat` è¿”回"收到"(证明 DeepSeek key å–自本机覆盖文件);
- `git grep` ç¡®è®¤è·Ÿè¸ªæ–‡ä»¶ä¸­æ—  `sk-` å¯†é’¥ï¼›ä»“库内两份部署模板均为占位版。
### 4. æœ¬æœºåŽ»æ˜Žæ–‡ + æ¸…理历史密钥(用户同意后)
- æœ¬æœºçœŸå®žå€¼æ”¹ä¸º **Windows ç”¨æˆ·çŽ¯å¢ƒå˜é‡**(`setx TRAFFIC_DB_PASSWORD` / `setx DEEPSEEK_API_KEY`),`config/application.yml` æ”¹æˆæ— æ˜Žæ–‡è¯´æ˜Žæ–‡ä»¶ï¼›
- `start-dev.ps1` å¢žåŠ **注册表兜底**:旧 shell ä¹Ÿèƒ½è‡ªåŠ¨è½½å…¥çŽ¯å¢ƒå˜é‡ï¼ˆå®žæµ‹è¾“å‡º"已从用户环境变量载入 â€¦");
- æ¸…理仓库内含 key çš„æœªè·Ÿè¸ªæ–‡ä»¶ï¼š`_shots/all_events.json`(13 å¤„)、`_dep_readme.txt`(1 å¤„)→ æ›¿æ¢ä¸º `sk-REDACTED`,全仓复查无明文;
- å½“前服务已用新方式重启:登录 OK + AI å›žç­”"收到",功能无回归。
## äºŒã€æµ‹è¯•结果摘要
- æŠ¥å‘Šï¼š`docs/功能测试报告/功能测试报告_密钥外部化与打包去密_2026-09-26.md`(7 æ¡ç”¨ä¾‹å…¨é€šè¿‡ï¼‰ã€‚
## ä¸‰ã€é—留问题与待办
1. **【需用户操作】轮换已泄露的 DeepSeek key**:控制台新建 key â†’ åˆ é™¤æ—§ key â†’ éƒ¨ç½²æœºå¤–部 `application.yml` å¡«æ–° key â†’ é‡å¯éªŒè¯ã€‚æ—§ jar æ— æ³•收回,轮换是唯一根治手段。
1. **【仍需用户操作】轮换已泄露的 DeepSeek key**(本机与仓库已无明文,但旧 jar é‡Œçš„那份还没作废):控制台新建 key â†’ åˆ é™¤æ—§ key â†’ éƒ¨ç½²æœºå¤–部 `application.yml` å¡«æ–° key â†’ é‡å¯éªŒè¯ã€‚æ—§ jar æ— æ³•收回,轮换是唯一根治手段。
2. æœ¬æœºæ•°æ®åº“ root å£ä»¤ï¼ˆ123456)同样在旧 jar é‡Œï¼Œå»ºè®®éƒ¨ç½²æœºæ¢å£ä»¤ã€‚
3. ä¸‹æ¬¡é‡æ–°æ‰“包给部署机时,建议按 `打包部署说明.md` çš„自查步骤确认 jar å†…无真实值,并顺带同步部署包内的旧母版(P2-5)。
4. é¡¹ç›®å…¶å®ƒé—留(P0/P1/P2)见 `docs/交接文档_2026-09-21.md` ç¬¬ 4 èŠ‚ä¸Ž `docs/交接文档_2026-09-23.md`。
docs/´ò°ü²¿Êð˵Ã÷.md
@@ -233,6 +233,19 @@
| jar åŒçº§çš„ `backend/application.yml` | éƒ¨ç½²æœºçœŸå®žå€¼ï¼ˆä¼˜å…ˆçº§é«˜äºŽ jar å†…置) | å¦ | å¦ï¼ˆåœ¨åŒ…外,现场填) |
| çŽ¯å¢ƒå˜é‡ `TRAFFIC_DB_PASSWORD` / `TRAFFIC_DB_USER` / `TRAFFIC_DB_URL` / `TRAFFIC_JWT_SECRET` / `DEEPSEEK_API_KEY` | è¦†ç›–以上任意一项 | å¦ | å¦ |
### æœ¬æœºå¼€å‘(值放环境变量,不落文件)
```powershell
setx TRAFFIC_DB_PASSWORD "本机 MySQL å£ä»¤"     # è®¾ä¸€æ¬¡å³å¯ï¼Œä¹‹åŽæ–°å¼€çš„终端自动带上
setx DEEPSEEK_API_KEY   "DeepSeek key"
# éœ€è¦æ—¶å†è¦†ç›–:setx TRAFFIC_DB_URL / TRAFFIC_DB_USER / TRAFFIC_JWT_SECRET
powershell -NoProfile -ExecutionPolicy Bypass -File start-dev.ps1   # ä¼šè‡ªåŠ¨ä»Žæ³¨å†Œè¡¨è¡¥é½å¹¶æ³¨å…¥åŽç«¯è¿›ç¨‹
```
- `traffic-audit-server/config/application.yml` åªç•™æ³¨é‡Šè¯´æ˜Žï¼ˆæ— æ˜Žæ–‡ï¼‰ï¼›åˆ æŽ‰å®ƒä¹Ÿä¸å½±å“ï¼ˆå€¼å…¨åœ¨çŽ¯å¢ƒå˜é‡é‡Œï¼‰ã€‚
- è‹¥ç”¨ IDE ç›´æŽ¥è·‘主类,请在**新开的**终端/IDE é‡Œå¯åŠ¨ï¼ˆè®©æ–°ç»ˆç«¯ç»§æ‰¿ç”¨æˆ·çŽ¯å¢ƒå˜é‡ï¼‰ï¼Œæˆ–æ‰‹åŠ¨ `setx` åŽé‡å¯ IDE。
### æ‰“包前自查(30 ç§’)
```powershell
start-dev.ps1
@@ -12,6 +12,19 @@
$root = Split-Path -Parent $MyInvocation.MyCommand.Path
$webDir = Join-Path $root 'traffic-audit-web'
# ---------- å¯†é’¥ï¼šä»Ž Windows ç”¨æˆ·çŽ¯å¢ƒå˜é‡è¡¥é½ï¼ˆçœŸå®žå€¼ä¸è½æ–‡ä»¶ï¼‰----------
# è‹¥å½“前 shell æ˜¯æ—§è¿›ç¨‹ã€æ‹¿ä¸åˆ°æ–°è®¾çš„变量,则从注册表 HKCU\Environment è¯»ä¸€æ¬¡ï¼Œ
# ä¾›åŽç«¯å­è¿›ç¨‹ç»§æ‰¿ï¼ˆé¿å…"密钥不在任何文件里、又读不到环境变量"的空档)。
foreach ($name in @('TRAFFIC_DB_PASSWORD', 'DEEPSEEK_API_KEY', 'TRAFFIC_DB_URL', 'TRAFFIC_DB_USER', 'TRAFFIC_JWT_SECRET')) {
  if (-not [Environment]::GetEnvironmentVariable($name, 'Process')) {
    $val = [Environment]::GetEnvironmentVariable($name, 'User')
    if ($val) {
      [Environment]::SetEnvironmentVariable($name, $val, 'Process')
      Write-Host "已从用户环境变量载入 $name"
    }
  }
}
function Test-PortListening($port) {
  try {
    $c = Get-NetTCPConnection -LocalPort $port -State Listen -ErrorAction Stop