feat: embed frontend in backend
This commit is contained in:
1 parent
22f9bcfa46
commit
fbe6abd519
12 files changed
+217
-13
No files matched your search
@@ -3,7 +3,7 @@
|
||||
## 1. 组件
|
||||
|
||||
```
|
||||
浏览器 (React, 独立域名 + SRI) 服务端 (.NET 10, NativeAOT)
|
||||
浏览器 (React, 独立托管或 API 同源嵌入) 服务端 (.NET 10, NativeAOT)
|
||||
┌──────────────────────────────┐ ┌─────────────────────────────┐
|
||||
│ UI: 频道、条目、预览、二维码 │ │ Minimal API + WebSocket/SSE │
|
||||
│ @webdrop/core (加解密、帧) │ 密文 + 令牌 │ 鉴权: 只比对令牌哈希 │
|
||||
@@ -15,7 +15,7 @@
|
||||
(元数据、日志) (磁盘,预留 S3)
|
||||
```
|
||||
|
||||
服务端没有解密函数,也没有任何能触达明文或 K 的代码路径。
|
||||
服务端没有解密函数,也没有任何能触达明文或 K 的代码路径。可选的 `WebDrop.Frontend` 模块只提供嵌入的静态资源,不访问频道存储或加解密代码。
|
||||
|
||||
## 2. 技术栈
|
||||
|
||||
@@ -84,8 +84,9 @@ SQLite 存元数据和小帧,磁盘存大帧。
|
||||
|
||||
## 5. 部署
|
||||
|
||||
- API 与前端使用**不同域名**:前端静态资源可以放在 CDN 或独立静态主机,API 被攻破不影响前端。
|
||||
- 前端构建产物为所有脚本和样式生成 SRI,发布时公布构建哈希。
|
||||
- 安全隔离部署时,API 与前端使用**不同域名**:前端静态资源可以放在独立静态主机,API 被攻破不影响前端代码。
|
||||
- Compose 单机模式可以把 Vite dist 嵌入 `WebDrop.Frontend`,由 API 同源提供页面;此模式简化部署,但 API 主机也是前端代码的信任根。
|
||||
- 独立托管时,前端资源应使用 HTTPS 发布;若部署 SRI,发布时公布构建哈希。
|
||||
- 响应头:`Referrer-Policy: no-referrer`、严格 CSP、`X-Content-Type-Options: nosniff`。
|
||||
- 反向代理不得记录请求头(令牌)和完整 URL。
|
||||
- 服务端日志不含频道 id 明文,只含截断后的哈希。
|
||||
|
||||
+4
-2
@@ -1,6 +1,6 @@
|
||||
# 本地后端 Docker Compose
|
||||
|
||||
Compose 当前只启动 WebDrop API。前端继续使用现有的开发/独立托管方式;本地 Vite 开发服务器通过 `/api/v1` 代理访问 `127.0.0.1:5000`。API 默认只绑定 loopback,SQLite 数据保存在项目的 `./data` 目录。
|
||||
Compose 当前只启动一个 WebDrop API 容器;构建镜像时会先构建 `web/`,再由独立的 `WebDrop.Frontend` 模块将静态资源嵌入后端。访问 `http://127.0.0.1:5000/` 打开前端,API 使用同源 `/api/v1`。API 默认只绑定 loopback,SQLite 数据保存在项目的 `./data` 目录。
|
||||
|
||||
## 启动
|
||||
|
||||
@@ -15,10 +15,12 @@ API 地址为 `http://127.0.0.1:5000`。停止服务使用 `docker compose down`
|
||||
|
||||
## 前端连接
|
||||
|
||||
本机 `npm run dev` 使用 Vite 代理连接默认 API。独立部署前端时,在前端托管层把 `/api/v1` 代理到此 API 地址,这样无需开放 CORS。也可以为跨域托管配置 `WebDrop__CorsOrigins`,值应为明确的前端源列表。
|
||||
本机开发仍可使用 `cd web; npm run dev`,Vite 会代理 `/api/v1` 到本地 API。独立托管前端时,可单独构建 `web/` 并在前端托管层反向代理 `/api/v1`;跨域直连则配置明确的 `WebDrop__CorsOrigins`。
|
||||
|
||||
公网部署时,在 API 前配置 HTTPS 反向代理,并让代理连接 API 的 loopback 端口。不要把未加密 HTTP 直接暴露到公网。只有当该 API 端口仅能由可信代理访问时,才将 `WEBDROP_TRUST_FORWARDED_HEADERS` 设为 `true`。
|
||||
|
||||
嵌入模式减少自托管组件,但前端代码与 API 来自同一个部署信任域。若要让 API 节点被攻破时仍不能替换前端,应使用独立域名托管前端。
|
||||
|
||||
## 验证码
|
||||
|
||||
默认 `CAPTCHA_PROVIDER=none`。启用 Cap 时,在 `.env` 设置:
|
||||
|
||||
@@ -62,10 +62,13 @@
|
||||
|
||||
端到端加密的前提是浏览器执行的是正确的代码。如果同一个被攻破的后端同时下发前端,它可以换成偷 K 的页面。
|
||||
|
||||
第一版的缓解:
|
||||
- 前端静态资源托管在**独立于 API 的域名**,API 节点被攻破不影响前端。
|
||||
- 所有脚本使用 SRI,构建产物带版本哈希,发布时公布哈希。
|
||||
- 前端托管方被攻破的风险仍然存在。
|
||||
隔离部署的缓解:
|
||||
- 前端静态资源托管在**独立于 API 的域名**,API 节点被攻破不影响前端代码。
|
||||
- 可由独立托管方校验脚本 SRI 与构建哈希;前端托管方被攻破的风险仍然存在。
|
||||
|
||||
嵌入式部署的取舍:
|
||||
- `WebDrop.Frontend` 将 Vite dist 嵌入后端程序集,让 API 以同源方式提供页面。
|
||||
- 这只简化部署,不增强前端与后端的隔离。若部署主机或镜像被控制,攻击者仍可替换页面并窃取用户后续输入的密钥。
|
||||
|
||||
后续:发布签名加 PWA 校验、CLI 客户端(协议不依赖浏览器,第三方可自行实现)。
|
||||
|
||||
|
||||
Reference in new issue
Block a user