Files
CyberStrikeAI/plugins/browser-extension/cyberstrikeai-browser-extension/README.zh-CN.md
T
2026-07-16 11:30:34 +08:00

254 lines
11 KiB
Markdown
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.
## CyberStrikeAI 浏览器扩展
**当前版本:0.3.10**UI 为英文;中文说明见下文)
Chrome / EdgeChromiumDevTools 扩展:在开发者工具中捕获 **Network** 流量,发送到 CyberStrikeAI 进行 AI 辅助安全测试。能力与 Burp Suite 插件对齐,并按生产场景做了性能与体验优化。
---
### 快速开始
1. `chrome://extensions/` → 开发者模式 → **加载已解压的扩展程序**
2. 选择目录:`plugins/browser-extension/cyberstrikeai-browser-extension/`
3. 打开目标页面 → **F12** → 顶部 Tab **CyberStrikeAI**
4. 填写 Host / Port / Password → **Validate**(首次会请求访问服务器地址权限)
5. 左侧选中捕获请求 → **Send** → 在 **Output** 查看 AI 结果
点击浏览器工具栏图标可查看 **只读连接状态**;完整配置与操作均在 DevTools 面板内完成。
---
### 界面说明
```
┌─ 连接栏(Validate 成功后可收起)────────────────────────────┐
│ Logo │ https://host:port │ 连接设置 │ ● OK │
├─ 操作栏 ────────────────────────────────────────────────────┤
│ Send │ Latest XHR │ Stop │ Copy │ Clear │ ●捕获中/○已暂停 │
│ XHR/Fetch only │ Debug │ Markdown │
├──────────────┬──────────────────────────────────────────────┤
│ Test History │ Output │ Request │ Response │
│ Captured Req │ Progress + Final Response │
└──────────────┴──────────────────────────────────────────────┘
```
| 区域 | 说明 |
|------|------|
| **连接栏** | Host、Port、HTTPS、Password、Validate;成功后收起为 `https://host:port` 摘要 |
| **Test History** | 最多 50 次 Send 记录,可回看 Progress / Final |
| **Captured Requests** | 当前 Tab 捕获列表,最多 200 条,支持搜索 |
| **Output** | 默认 Tab:流式 Progress + Final Response |
| **Request / Response** | 查看选中流量的 HTTP/1.1 格式原文 |
---
### 功能一览
#### 捕获
- **Background 中枢**`devtools.js` 监听 Network → `service-worker` 队列 → Panel 订阅
- 默认 **XHR/Fetch only**(可关闭以捕获更多类型)
- 静态资源 URL / MIME **预过滤**,命中前不读响应体
- **● 捕获中 / ○ 已暂停**:暂停后零开销,已有列表仍可 Send
- 单条截断:请求体 **64KB**、响应 **4KB**
#### HTTP 展示与 AI Prompt
- **存储**:内存中保留原始 HAR(含 HTTP/2 伪首部 `:method` 等)
- **展示 / Prompt**:归一化为 **HTTP/1.1**(与 Burp 插件一致)
```http
GET /api/foo HTTP/1.1
Host: example.com
Cookie: ...
```
#### 发送到 CyberStrikeAI
- 弹窗选择:**项目 / 角色 / 对话模式**(动态 API)+ 测试指令
- 支持 **Eino Single**、**Deep**、**Plan-Execute**、**Supervisor**
- **Latest XHR**:一键选中最近 API 请求并打开发送弹窗
- **Stop**:中止本地 SSE + 调用服务端 `/api/agent-loop/cancel`
#### 流式输出
- Progress 日志上限 **512KB**(超出截断)
- **Final Response 不截断**(当前进行中的测试)
- 历史 run 切换后 Final 软截断 **100KB**
- **Markdown**:流式阶段纯文本;结束后 `requestIdleCallback` 渲染;超 **100KB** 降级纯文本
- **Copy**:复制当前 Request / Response / Final
#### 安全与权限
- Token 存 **chrome.storage.session**(关浏览器失效)
- 登录后保存 **`expires_at`**,状态栏显示 **剩余时间**(如 `OK · 剩余 11h 30m`
- **不会自动续期**:过期后需重新 Validate(需 Password
- 本地过期检测(30s+ 服务端 `/api/auth/validate` 探测(同周期;切回面板时立即探测)
- 服务不可达时显示 **无法连接服务**;重启后 Token 失效显示 **服务已重启或 Token 已失效**
- **401/403** 时自动清空 Token 并展开连接栏
- Send 前主动校验 Token 有效性
- **optional_host_permissions**Validate 时按需授权
- 权限申请直接绑定 Validate 点击事件,仅申请当前 CyberStrikeAI 服务 origin;已授权地址不会重复弹窗
---
### 按钮与选项
| 控件 | 作用 |
|------|------|
| **Validate** | 登录并校验 Token;进行中再次点击为 Cancel |
| **连接设置 / 收起** | 展开或折叠 Host/Port/Password 表单 |
| **Send** | 对选中捕获发起到 CyberStrikeAI |
| **Latest XHR** | 选中最近 XHR/Fetch 并 Send |
| **Stop** | 停止当前 AI 流(本地 + 服务端) |
| **Clear Output** | 清空当前 run 的 Progress / Final |
| **● 捕获中 / ○ 已暂停** | 启用或暂停 Network 捕获 |
| **XHR/Fetch only** | 只捕获 API 类请求 |
| **Debug events** | 在 Progress 显示更多 SSE 事件 |
| **Markdown** | Final 完成后渲染富文本 |
| **Clear All** | 清空 Test History |
| **Clear** | 清空当前 Tab 捕获列表 |
---
### 数据与内存(不会无限增长)
| 数据 | 上限 | 位置 | 清理时机 |
|------|------|------|----------|
| 捕获请求 | 200 条 / Tab | Background + Panel 内存 | 超出丢弃最旧;可手动 Clear |
| Tab 捕获槽 | 20 个 Tab | Background 内存 | 超出丢弃非当前 Tab |
| 测试历史 | 50 条 | Panel 内存 | 超出丢弃最旧;Clear All |
| Progress | 512KB / run | Panel 内存 | 超出截断 |
| Final(进行中) | 无硬上限 | Panel 内存 | — |
| Final(历史) | 100KB 软截断 | Panel 内存 | 切换到其他 run 时 |
| 配置 + Token | 极小 | chrome.storage | 手动改配置 |
- 关闭 **DevTools** → Panel 内存清空
- 关闭 **浏览器** → Session Token 失效
- Service Worker 被回收 → Background 捕获队列清空
---
### 性能说明
| 场景 | 影响 |
|------|------|
| 未开 DevTools | **无影响**(不监听 Network |
| DevTools 开 + 捕获暂停 | **几乎无影响** |
| DevTools 开 + 捕获中 + XHR only | 仅匹配请求有轻微开销 |
| 高流量 SPA | 建议保持 **XHR/Fetch only**,不需要时点 **已暂停** |
已做优化:过滤器内存缓存、静态资源不读 body、列表增量插入、搜索防抖、rAF 节流流式 UI。
---
### 常见问题
**扩展更新后报错 `chrome.runtime.connect` undefined**
扩展重载后旧 DevTools 面板上下文失效。请:**关闭 DevTools → 重新加载扩展 → 再开 F12**。
**Token 过期会自动刷新吗?**
**不会自动续期**(无 refresh token)。插件会保存 `expires_at`、显示剩余时间;每 30s 向服务端校验,切回 DevTools 时立即校验。服务重启后 session 清空,会提示重新 Validate。
**重启服务后状态还显示 OK**
v0.3.7 起每 30s 探测 `/api/auth/validate`;不可达显示黄色警告,Token 失效则清空并展开连接栏。重载扩展后请关闭 DevTools 再开 F12。
**Request 里为什么曾经有 `:authority`、`:method`**
HTTP/2 伪首部。展示与 AI Prompt 已归一化为 HTTP/1.1;原始 HAR 仍保存在内存 entry 中。
**Console 里 localhost CORS 报错是插件造成的吗?**
不是。那是页面自身请求本机服务被浏览器拦截,与扩展无关。
**Validate 显示 `cross-origin request denied`**
升级并重启 CyberStrikeAI 服务。新版服务会自动识别格式合法的 Chrome/Edge 扩展 Origin,无需复制插件 ID 或配置 CORS 白名单;插件首次 Validate 时仍会请求访问目标服务地址的浏览器权限。
**Validate 要求允许访问 CyberStrikeAI 服务?**
在浏览器弹出的权限框中允许访问当前服务地址。插件只按需申请所填写的服务 origin,不需要开启全站访问。如果未出现权限框,请在 `chrome://extensions/` 重新加载扩展,完全关闭 DevTools 后再打开并点击 Validate。
**HTTPS 显示无法连接,但 Burp 正常?**
Burp 插件会信任自签名证书,浏览器扩展不能绕过 Chromium 的 TLS 校验。请先在浏览器中打开服务地址并信任证书;生产环境建议使用包含服务 IP/域名 SAN 的受信任证书。
**Test History 很多会挡住 Captured Requests 吗?**
不会。历史区最高占侧边栏 **42%**,超出部分区域内滚动;捕获区占剩余空间。
**会拖慢网页吗?**
日常浏览(不开 DevTools)无影响。调试时可用 **已暂停** 完全停止捕获。
---
### Popup 与 DevTools 分工
| 位置 | 用途 |
|------|------|
| **DevTools 面板** | 连接、Validate、捕获、Send、Output(主工作区) |
| **扩展 Popup** | 只读连接状态 + 版本号 + 打开 DevTools 引导 |
不在 Popup 中重复完整配置表单,避免与主流程脱节。
---
### 打包发布
```bash
bash plugins/browser-extension/cyberstrikeai-browser-extension/package.sh
# → dist/cyberstrikeai-browser-extension.zip
```
图标从项目根 `images/logo.png` 生成:
```bash
LOGO="images/logo.png"
ICONS="plugins/browser-extension/cyberstrikeai-browser-extension/icons"
for size in 16 48 128; do
sips -z $size $size "$LOGO" --out "$ICONS/icon${size}.png"
done
```
---
### 限制
- Chrome **不提供** Network 面板右键菜单 API → 使用 **Latest XHR** + 自建列表
- Firefox 需 `about:debugging` 临时加载;`storage.session` 不可用时 Token 回退 `local`
- 无法一键从 Popup 跳转到 DevTools 指定面板(Chrome API 限制)
---
### 目录结构
```text
manifest.json # MV3 清单
background/service-worker.js # 捕获队列、Panel Port、全局开关
devtools.js # Network 监听(最早过滤)
devtools.html
panel/
panel.html / panel.js / panel.css # 主 UI
popup/
popup.html / popup.js / popup.css # 只读状态
lib/
auth-session.js # Token 过期检测与剩余时间提示
api.js # 登录、SSE、项目/角色 API
storage.js # 配置 + session token + expires_at
capture.js # HAR 摘要、静态过滤
http-normalize.js # HTTP/2 → HTTP/1.1 展示/Prompt
formatter.js # toPrompt 组装
markdown.js # Final Markdown 渲染
catalog-cache.js # 项目/角色 5 分钟缓存
constants.js # 上限常量
icons/ # 16 / 48 / 128
package.sh
```
---
### 与 Burp 插件对比
| 能力 | Burp 插件 | 浏览器扩展 |
|------|-----------|------------|
| 流量来源 | Proxy 历史 | DevTools Network |
| 连接配置 | Tab 内 | Tab 内(可折叠) |
| HTTP 格式 | HTTP/1.1 | 展示/Prompt 归一化为 HTTP/1.1 |
| 项目/角色/模式 | Send 弹窗 | Send 弹窗 |
| SSE 输出 | Progress + Final | Progress + Final |
| 捕获开关 | — | ● 捕获中 / ○ 已暂停 |