netray-info/spectra
GitHub: netray-info/spectra
对目标 URL 发起三个并发 HTTP 探测,全面分析安全响应标头并生成结构化审计报告的 Web 工具与 API 服务。
Stars: 0 | Forks: 0
# spectra
**HTTP 标头检查与安全审计 —— 三个探测,一份报告。**
spectra 是一个基于 Web 的工具,可对目标 URL 发起三个并发的 HTTP/HTTPS 探测,分析每一个响应标头类别,并生成包含每项检查结论的结构化安全报告。无需浏览器扩展,无需手动操作 curl —— 只需一个 URL,即可获得结果。
在线访问 [http.netray.info](https://http.netray.info) · [netray.info](https://netray.info) 工具链的一部分,与 [tls.netray.info](https://tls.netray.info)、[dns.netray.info](https://dns.netray.info) 和 [ip.netray.info](https://ip.netray.info) 并列。
## 它的功能
给定一个 URL,spectra 会:
- **验证并规范化输入** —— 裸主机名将自动添加 `https://` 前缀;显式的 `http://` 会被拒绝(HTTP 探测会自动触发)
- **发起三个并发探测** —— HTTPS 链、HTTP 80 端口升级,以及 CORS 探测 —— 均在单个可配置的超时时间内完成
- **捕获完整的重定向链** —— 记录每一跳:URL、状态码、Location 标头和 HTTP 版本
- **分析安全标头** —— HSTS (max-age, preload)、Content Security Policy(指令,unsafe-inline,unsafe-eval,通配符)、X-Frame-Options、X-Content-Type-Options、Referrer-Policy、Permissions-Policy、COOP、COEP、CORP
- **评估 CORS 策略** —— 通配符源、反射源、凭证标志;反射源结合 `Access-Control-Allow-Credentials: true` 将自动判定为 Fail
- **审计每一个 cookie** —— Secure、HttpOnly、SameSite、域范围 —— 针对 每个 cookie 给出结论
- **解析缓存指令** —— Cache-Control 标志、ETag、Last-Modified、Vary、来自上游代理的 Age
- **检测 CDN 存在** —— 基于特征检测 Cloudflare、CloudFront、Fastly、Akamai、Azure、Vercel、Fly.io、Netlify、BunnyCDN —— 以及它们的缓存状态
- **标记指纹标头** —— Server、X-Powered-By、X-Generator、X-Debug-Token、X-Runtime 及类似的信息泄露候选项
- **识别已弃用的标头** —— X-XSS-Protection、Expect-CT、Public-Key-Pins —— 这些标头不仅毫无用处,甚至可能适得其反
- **对每项检查独立评分** —— Pass / Warn / Fail / Skip 并附带解释;总体结论是所有检查中的最高严重级别
- **附加 IP 元数据** —— 通过 IP 增强服务提供 ASN、组织 和网络类型(住宅 / 数据中心 / VPN / Tor)
这三个探测并发运行。整个检查过程通常在两秒内完成。
## 三个探测
大多数标头扫描器只发出一个请求。spectra 会发出三个,因为一个是不够的:
| 探测 | 发现什么 |
|---|---|
| **HTTPS 链** | 针对主 HTTPS 端点的完整标头分析;捕获完整的重定向链 |
| **HTTP 80 端口升级** | 80 端口是否重定向到 HTTPS?是否在同一主机上?是否使用了合适的状态码? |
| **CORS 探测** | 发送 `Origin: https://evil.example.com` 并检查返回内容 —— 通配符、反射或无响应 |
## 输入语法
```
https://hostname[/path][?query]
hostname (auto-prefixed with https://)
```
| 示例 | 作用 |
|---|---|
| `example.com` | 检查 `https://example.com` |
| `example.com/api/data` | 检查特定路径 |
| `https://example.com:8443` | 非标准 HTTPS 端口 |
显式的 `http://` 方案会被拒绝 —— HTTP 80 端口升级探测会对任何 `https://` 目标自动触发。内部 IP (RFC 1918,环回,链路本地) 在任何连接建立之前都会被阻止。
## API
```
POST /api/inspect {"url": "https://example.com"}
GET /api/inspect?url=https://example.com
```
返回包含完整检查结果的结构化 JSON 文档。有关完整 schema,请参阅 [API 文档](/docs) 或 [OpenAPI 规范](/api-docs/openapi.json)。
```
curl -s 'https://http.netray.info/api/inspect?url=example.com' | jq .quality
```
其他端点:
| 端点 | 描述 |
|---|---|
| `GET /health` | 存活探测 |
| `GET /ready` | 就绪探测 |
| `GET /api/config` | 服务器版本 |
| `GET /api-docs/openapi.json` | OpenAPI 3.1 规范 |
| `GET /docs` | 交互式 API 文档 |
### CI / Pipeline 集成
在 GitHub Actions 中使用,以安全态势作为关卡:
```
# 如果整体裁定不为 pass,则使 build 失败
- run: |
curl -sf 'https://http.netray.info/api/inspect?url=$URL' \
| jq -e '.quality.verdict == "pass"'
# 如果端口 80 未重定向到同一 host 的 HTTPS,则判定为失败
- run: |
curl -sf 'https://http.netray.info/api/inspect?url=$URL' \
| jq -e '.http_upgrade.redirects_to_https and .http_upgrade.same_host'
# 检查没有任何 cookies 缺少 Secure flag
- run: |
curl -sf 'https://http.netray.info/api/inspect?url=$URL' \
| jq -e '[.quality.checks[] | select(.name == "cookie_secure" and .status == "pass")] | length > 0'
```
## 构建
前置条件:Rust 工具链,Node.js(用于前端)。
```
# 完整的生产 build(前端 + Rust 二进制文件)
make
# Build release 二进制文件 + 运行它(读取 spectra.dev.toml)
make run
# 开发(两个终端)
make frontend-dev # Vite dev server on :5175, proxies /api/* to :3000
make dev # cargo run (debug build, reads spectra.dev.toml)
# Tests 和 lints
make test # Rust tests
make lint # clippy + fmt check
make ci # Full CI: lint + test + frontend build
```
Release 二进制文件嵌入了编译后的前端。无需单独的静态文件托管。
## 配置
复制 `spectra.example.toml` 并进行调整:
```
[server]
bind = "127.0.0.1:3000"
metrics_bind = "127.0.0.1:9090"
# trusted_proxies = ["10.0.0.0/8"]
[inspect]
request_timeout_secs = 10 # per-probe timeout
total_timeout_secs = 30 # wall-clock cap across all three probes
max_redirects = 10
user_agent = "netray-spectra"
[limits]
per_ip_per_minute = 10
per_ip_burst = 5
per_target_per_minute = 30
per_target_burst = 10
max_concurrent_connections = 256
[enrichment]
ip_url = "https://ip.netray.info" # optional; omit to disable IP enrichment
timeout_ms = 500
[telemetry]
log_format = "text" # "text" | "json"
enabled = false # set true to enable OTLP export
# otlp_endpoint = "http://localhost:4318"
service_name = "spectra"
sample_rate = 1.0
```
默认情况下,配置从 `spectra.toml` 加载。可以使用 `SPECTRA_CONFIG` 覆盖路径。环境变量优先于文件,使用 `SPECTRA_` 前缀和 `__` 作为节分隔符 —— 例如 `SPECTRA_SERVER__BIND=0.0.0.0:3000`。
## 质量检查
每项检查都会产生一个 Pass / Warn / Fail / Skip 结论。总体结论是所有检查中的最高严重级别。
**安全标头**
- HSTS —— 解析 max-age;低于 1 年 (31 536 000 s) 则 Warn;如果缺失则 Fail;注意 preload 标志
- CSP —— 强制与仅报告;检测 `unsafe-inline`、`unsafe-eval`、缺失 `default-src`、通配符方案 (`https:`, `*`)、广泛通配符 (`*.com`) 以及缺失 `object-src` 限制
- X-Frame-Options —— 接受 DENY 或 SAMEORIGIN;如果缺失则 Warn
- X-Content-Type-Options —— 必须为 `nosniff`;如果缺失则 Warn
- Referrer-Policy —— 对不安全的值 (`origin`、`origin-when-cross-origin`、`unsafe-url`) 和无法识别的值发出 Warn;如果缺失则 Warn
- Permissions-Policy —— 如果缺失则 Warn
- COOP / COEP / CORP —— 如果缺失则 Warn;跨域隔离所必需
**CORS**
- 通配符源 —— 对 `Access-Control-Allow-Origin: *` 发出 Warn
- 源反射 —— 如果响应镜像了请求的 `Origin` 标头则发出 Warn
- 凭证 —— 如果存在反射源且为 `Access-Control-Allow-Credentials: true` 则 Fail (凭证窃取向量)
**Cookies**
对每个 `Set-Cookie` 响应标头进行单独的 cookie 检查:
- `Secure` 标志 —— 如果缺失则 Warn (cookie 可以通过纯 HTTP 发送)
- `HttpOnly` 标志 —— 如果缺失则 Warn
- `SameSite` —— 对没有 `Secure` 的 `None` 发出 Warn;如果不存在则 Skip
**传输升级**
- HTTP 重定向 —— 如果 80 端口无响应则 Warn;如果 80 端口提供内容但未重定向到 HTTPS 则 Fail
- 同主机重定向 —— 如果重定向目标是不同的主机名则 Warn
**指纹识别**
- 检测 `Server`、`X-Powered-By`、`Via`、`X-AspNet-Version`、`X-AspNetMVC-Version`、`X-Generator`、`X-Debug-Token`、`X-Runtime`
- 如果存在任何暴露信息的标头则 Warn;包括违规标头名称的列表
**已弃用的标头**
- `X-XSS-Protection` —— 已弃用并已从所有主流浏览器中移除
- `Expect-CT` —— 自 CT 强制执行起已过时
- `Public-Key-Pins` / `Public-Key-Pins-Report-Only` —— 已弃用,现在存在变砖风险
## 前端特性
- **三探测面板** —— 分别显示 HTTPS 链、HTTP 升级探测和 CORS 探测的结果选项卡
- **质量判定徽章** —— 带有按项分解和可展开解释的彩色总体结论 (pass / warn / fail)
- **重定向链查看器** —— 显示每一跳的 URL、状态和 HTTP 版本
- **Cookie 表格** —— 按 cookie 划分的属性分解,并高亮显示安全标志
- **CDN 徽章** —— 内联显示检测到的 CDN 及其缓存状态
- **IP 增强行** —— 在概览栏中展示 ASN、组织和网络类型
- **复制到剪贴板** —— 原始 JSON 或 Markdown;单个标头值带有复制按钮
- **键盘快捷键** —— 回车提交,Escape 清除
## 安全性
spectra 会向用户指定的目标发起出站 HTTP/HTTPS 连接。其安全模型是纵深防御:
1. **输入验证** —— URL 语法检查,方案允许列表,不允许 `javascript:` 或 `data:` URI
2. **目标策略** —— DNS 解析出的 IP 在任何连接建立之前会根据阻止列表 (RFC 1918,环回,链路本地,CGNAT,组播) 进行检查。通过仅解析一次并检查结果来缓解 DNS 重绑定。
3. **速率限制** —— 针对源 IP 的 GCRA (10次/分钟,突发 5) 和针对目标主机名的 GCRA (30次/分钟,突发 10)。两种 429 响应都包含 `Retry-After`。
4. **并发上限** —— Tower `ConcurrencyLimitLayer` 将进行中的请求限制为 256。
5. **Body 读取** —— 响应 body 读取不会超过一个小上限 (默认 1 KB)。spectra 仅分析标头。
## 技术栈
**后端**:Rust · axum · reqwest · tokio · tower-governor
**前端**:SolidJS · Vite · TypeScript (strict)
## 许可证
MIT —— 详见 [LICENSE](LICENSE)。
标签:C2日志可视化, CDN检测, Cookie审计, CORS检测, CSP分析, DNS枚举, HSTS检测, HTTPS, HTTP分析, HTTP头部检测, HTTP安全头, LNA, SEO工具, Web安全, 信息泄露, 反取证, 可视化界面, 安全评估, 密码管理, 指纹识别, 插件系统, 数据泄露, 站长工具, 网络安全, 网络安全工具, 网络测绘, 蓝队分析, 通知系统, 重定向跟踪, 隐私保护