Nooshu/CSP-Playground

GitHub: Nooshu/CSP-Playground

一款基于浏览器的可视化 CSP 策略构建工具,帮助开发者轻松创建、导入、评分并导出内容安全策略。

Stars: 0 | Forks: 0

# CSP 练习场 一个基于浏览器的工具,用于构建 [内容安全策略](https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CSP) (CSP) 头部。启用指令,选择常见关键字,添加自定义源 URL,查看实时安全评分,并复制生成的策略或现成的代码片段到你的 Web 服务器。 该应用完全在浏览器中运行以进行策略编辑。**从 URL 导入**使用小型的服务端查找(开发中使用 Vite middleware,生产中使用 [Cloudflare Pages Functions](https://developers.cloudflare.com/pages/functions/)),以便你可以从 HTTP 头部或 HTML meta 标签中获取现有策略。**粘贴头部或策略**完全在浏览器中运行——粘贴完整的响应头部块或单行 `Content-Security-Policy` 即可提取并导入 CSP。 ## 目的 内容安全策略 (CSP) 是防御跨站脚本攻击 (XSS) 和相关注入攻击最有效的方法之一,但其语法很容易写错。CSP Playground 通过以下方式降低了编写正确策略的门槛: - 将每个标准指令映射到易于访问的表单控件 - 解释 sandbox 标志并链接到 MDN 文档 - 生成 nonce、style 属性哈希和服务器配置代码片段 - 启发式地为你的策略评分并提出具体的改进建议 如果某个网站还没有 CSP,导入器会链接到 [why-csp.html](why-csp.html)——这是一份关于为什么以及如何采用该策略的简短指南。 ## 功能 ### 策略编辑器 - 基于表单的编辑器,支持**所有标准 CSP 指令**,按类别分组: - Fetch (`default-src`, `script-src`, `style-src`, …) - Document (`base-uri`, `sandbox`, …) - Navigation (`form-action`, `frame-ancestors`, …) - Reporting (`report-uri`, `report-to`, …) - 其他 (`upgrade-insecure-requests`, Trusted Types, …) - 独立启用/禁用每个指令 - **关键字下拉菜单**,提供常用值 (`'self'`, `'none'`, `'unsafe-inline'`, `'strict-dynamic'`, schemes 等) - 每个指令支持多个自定义源输入,并提供添加/删除控件 - **Sandbox 指令** — 每个 sandbox 标志都有对应的复选框列表,每个都带有一个 **?** 帮助图标,在悬停/聚焦时显示描述 - **Trusted Types** 指令带有适当的单值或多值控件 - 每个指令名称旁边都有 **MDN 文档链接** ### 导入现有策略 从在线 URL 或粘贴的文本将现有的 CSP 导入到构建器中: - **从 URL 导入** — 输入网站 URL 并从以下位置获取其 CSP: - `Content-Security-Policy` / `Content-Security-Policy-Report-Only` 响应头部 - HTML 中的 `` 标签 - **粘贴头部或策略** — 直接粘贴到表单中(无需服务端查找): - 完整的 HTTP 响应头部;将自动提取 `Content-Security-Policy` - 单独的一行 `Content-Security-Policy:` 头部信息 - 根据解析出的策略自动填充构建器表单 - **验证 CSP** 检查格式并提出更正建议(适用于 URL 和粘贴导入) - 未找到策略时的优雅处理(提供指向 why-CSP 指南的链接) ### Nonce 和哈希助手 - **Script/style nonce 助手**(作用于 `script-src`, `script-src-elem`, `style-src`, `style-src-elem`): - 生成**示例**加密随机 nonce,并为内联或外部脚本/样式表生成匹配的 HTML 代码片段 - 将 `'nonce-…'` 添加到指令中 - **生产环境注意事项:** 在生产环境中,必须在服务器上为**每个 HTTP 响应生成新的 nonce**,并将相同的值注入到你的 CSP 头部和 HTML 中——切勿重复使用从此工具复制的固定 nonce - **Style 属性哈希助手**(作用于 `style-src-attr`): - 通过 Web Crypto 对确切的 `style="…"` 属性值进行 SHA-256 哈希计算 - 在需要时添加 `'sha256-…'` 和 `'unsafe-hashes'` - 复制带有已计算哈希属性的示例元素 ### 实时输出和导出 - 实时预览**策略值**和完整的 **HTTP 头部行** - 切换**强制执行 (enforce)** 与 **Content-Security-Policy-Report-Only** 以实现安全部署 - 一键复制策略值、头部或 Web 服务器代码片段 - 导出适用于 **Apache**、**Nginx**、**Caddy**、**LiteSpeed**、**Microsoft IIS**、**Traefik** 和 **Envoy** 的代码片段 - 带有 MDN 安全 CSP 实施指南链接的部署免责声明 ### 安全评分 - 实时**字母等级**(差 → 优秀)及数字得分 - 影响得分下降或提升的因素明细 - **可操作的建议**及预计的得分加成 - 点击建议可滚动到表单中的相关指令 - 评分中反映了 Report-only 模式(不会拦截违规行为) ### 无障碍设计 - 语义化 HTML、标签、焦点样式以及用于动态更新的 `aria-live` 区域 - 支持键盘访问的控件和工具提示 ## 技术栈 | 层级 | 选择 | |-------|--------| | UI | TypeScript, 原生 DOM (无框架) | | Bundler | [Vite](https://vite.dev/) | | Package manager | [Yarn v1](https://classic.yarnpkg.com/) (`yarn.lock` 是权威配置) | | Tests | [Vitest](https://vitest.dev/) + jsdom, v8 coverage | | Deployment | 在 [Cloudflare Pages](https://pages.cloudflare.com/) 上的静态 `dist/` + Pages Functions | ## 入门指南 ### 前置条件 - [Node.js](https://nodejs.org/) 18+ (`.nvmrc` 将本地开发环境固定为 Node 20) - [Yarn](https://yarnpkg.com/) 1.x ### 安装 ``` yarn install ``` ### 开发 ``` yarn dev ``` 打开 [http://localhost:5173](http://localhost:5173)。URL 导入通过 Vite middleware shim 实现——日常的 UI 开发不需要 Wrangler。 ### 构建 ``` yarn build ``` 静态文件将输出到 `dist/`。使用以下命令预览生产构建: ``` yarn preview ``` ### 测试 ``` yarn test # Run once yarn test:watch # Watch mode yarn test:coverage # Coverage with thresholds (100% lines/statements/functions, 95% branches) ``` ### 依赖完整性 直接依赖**被固定在精确的版本**。在任何依赖更新后,当所有更改完成时,运行**一次**验证: ``` yarn verify:deps ``` 完整的依赖策略请参阅 [AGENTS.md](AGENTS.md)。 ## 用法 1. 可选择在顶部使用**导入现有策略**——从 URL 获取,或粘贴响应头部 / `Content-Security-Policy` 头部行——然后点击 **Import CSP**。 2. 使用复选框启用指令(例如 `default-src`)。 3. 从下拉菜单中添加关键字或输入自定义源(例如 `https://cdn.example.com`)。 4. 在需要安全允许内联内容的地方使用 nonce 或 style-hash 助手。 5. 查看**安全评分**面板,如有帮助,请应用相关建议。 6. 在输出面板中查看生成的策略。 7. 复制策略、完整的头部或 Web 服务器配置代码片段。 切换 **Content-Security-Policy-Report-Only** 以在强制执行前生成用于测试的 report-only 头部。 ## 项目布局 ``` src/csp/ Policy parsing, building, scoring, keywords, hashes, server exports src/ui/ Form components, output panel, security score, helpers src/api/ Client fetch wrapper for CSP lookup server/ Shared lookup logic + Vite dev middleware functions/api/ Cloudflare Pages Function (production API) tests/ Vitest unit and integration tests public/data/ Sandbox flag descriptions (loaded for tooltips) ``` ## 部署到 Cloudflare Pages 生产环境中的 URL 导入使用 [Cloudflare Pages Functions](https://developers.cloudflare.com/pages/functions/)。位于 [`functions/api/csp-lookup.ts`](functions/api/csp-lookup.ts) 的函数在 Cloudflare 的边缘节点上暴露了 `POST /api/csp-lookup` 接口——与本地开发的契约相同。 ### Dashboard 设置 1. 将此仓库连接到 Cloudflare Pages。 2. **构建命令:** `yarn build` 3. **构建输出目录:** `dist` 4. **根目录 / 路径:** 留空(仓库根目录) Cloudflare 会从 `wrangler.toml` 读取 `pages_build_output_dir`,并将 `functions/` 与静态资源一起部署。不需要部署命令或单独的 Worker。 ### 本地 Pages 预览 在本地测试静态资源和 Pages Function: ``` yarn pages:dev ``` ### CLI 部署 ``` yarn pages:deploy ``` 需要 [Wrangler](https://developers.cloudflare.com/workers/wrangler/) 身份验证 (`wrangler login`)。 ## 贡献 / AI 代理 - [AGENTS.md](AGENTS.md) — 编码代理规范 (也可作为 `AGENT.md` 使用) - `.cursor/rules/` — 用于依赖固定和项目上下文的 Cursor 专用规则 - `src/`, `server/`, 和 `functions/` 中导出 API 的 TSDoc 注释 ## 许可证 [MIT](LICENSE)
标签:Syscall, Web开发, 内容安全策略, 前端工具, 浏览器端应用, 自动化攻击, 规则仓库