SetraTheXX/next-secure-check

GitHub: SetraTheXX/next-secure-check

这是一个专为 Next.js 设计的规则驱动静态安全扫描器,用于在开发阶段发现常见安全漏洞。

Stars: 4 | Forks: 0

# next-安全检查 适用于 Next.js 项目的确定性安全检查工具。无需 AI。 `next-secure-check` 帮助开发者在项目上线前发现常见的安全问题:泄露的密钥、不安全的 API 路由、缺失的速率限制、薄弱的配置、XSS 风险、原始 SQL 模式、不安全的文件上传端点以及缺失的安全标头。 演示视频计划中。 于 2026 年 5 月 9 日启动。 ## 当前状态 已完成: - 命令行界面 MVP - 20 条确定性安全规则 - 跨包和网页演示共 374 项测试通过 - 终端、JSON、Markdown、GitHub 和 SARIF 报告格式 - 关于发现结果的上下文元数据 - 用于应用、严格、CI、审计、库和 monorepo 扫描的命令行预设系统 - 具有上下文感知的严重性/置信度调整,以减少大型代码库中的噪声结果 - 基于抽象语法树辅助的命令执行、原始 SQL 插值、危险 HTML 渲染和密码处理检查 - 具有路由感知的管理员路由检测和端点感知的文件上传验证 - 带有步骤摘要输出的 GitHub Actions 验证 - `docs/rules` 目录中的规则文档 - 用于扫描公共 GitHub 仓库的 `apps/web` 网页演示 - GitHub 仓库 URL 验证、元数据检查、tarball 下载、安全解压、清理、API 扫描端点、报告界面、排除开关以及 JSON/Markdown 导出 - 第 4.5+ 阶段网页演示加固,包括仓库大小检查、服务端脱敏、扫描滥用防护、强化安全标头、孤立临时文件清理、可选的 GitHub 令牌支持以及强化的客户端 IP 解析 - 发布前对提交的 `.env.*` 变体和部分安全标头检测的规则覆盖优化 当前发布重点: ``` v0.2.x: collect real project feedback, improve usage docs, and keep false-positive handling honest. ``` 网页演示仅使用静态分析扫描公共 GitHub 仓库。它不会运行仓库代码、安装依赖、执行测试或访问私有仓库。 ## GitHub Actions 演示 命令行界面在 GitHub Actions 中作为此仓库 CI 的一部分运行。 - 工作流使用 `--format github` 运行扫描器,并通过 `$GITHUB_STEP_SUMMARY` 将 markdown 报告写入作业的 **步骤摘要**。 - 当使用 `--fail-on high` 时,如果报告了任何严重级别为 HIGH 的发现,作业将失败。 - 当使用 `--fail-on critical` 时,仅当扫描摘要的风险级别为 `critical` 时作业才会失败。 - 步骤顺序为:构建 -> 类型检查 -> 测试 -> 安全检查,确保在类型检查之前编译工作区包。 - 发现结果是确定的模式匹配;不执行漏洞利用证明。 ## 存在意义 AI 辅助开发使得快速交付变得容易,但也容易忽略安全基础。本项目专注于基于证据的检查,这些检查易于理解,对初级开发者、自由职业者、小型 SaaS 团队和代理机构非常有用。 ## 学习项目与开发理念 这是一个由学生构建的学习项目。作为一名计算机编程专业的一年级学生,我正在开发它以提升我在 TypeScript、Next.js 安全、静态分析、开源项目结构、测试和产品思维方面的技能。 AI 在速度、结构和反馈方面有所帮助,但技术所有权、产品方向、代码审查、测试、发布决策和最终责任仍由我承担。 我仍在学习中,因此欢迎提出问题、反馈和批评性评论。发现结果应被视为审查信号,而不是漏洞利用的证明,并且可能存在误报或漏报。 ## 当前规则 扫描器目前检查 20 种常见的安全模式。您可以在[规则文档](./docs/rules)目录中阅读有关每条规则的更多信息。 1. **[secrets/env-file-committed](./docs/rules/env-file-committed.md)**: 检测已提交的 `.env` 文件。 2. **[secrets/hardcoded-secret](./docs/rules/hardcoded-secret.md)**: 检测硬编码的 API 密钥和令牌。 3. **[secrets/weak-jwt-secret](./docs/rules/weak-jwt-secret.md)**: 检测弱或默认的 `JWT_SECRET` 值。 4. **[injection/no-eval](./docs/rules/no-eval.md)**: 检测 `eval()` 的使用。 5. **[injection/no-new-function](./docs/rules/no-new-function.md)**: 检测 `new Function()` 的使用。 6. **[injection/command-exec](./docs/rules/command-exec.md)**: 检测 shell 命令执行。 7. **[xss/dangerously-set-inner-html](./docs/rules/dangerously-set-inner-html.md)**: 检测 React 中的原始 HTML 渲染。 8. **[config/insecure-cors-wildcard](./docs/rules/insecure-cors-wildcard.md)**: 检测通配符 CORS 源。 9. **[auth/login-without-rate-limit](./docs/rules/login-without-rate-limit.md)**: 检测缺少速率限制的登录端点。 10. **[auth/register-without-rate-limit](./docs/rules/register-without-rate-limit.md)**: 检测缺少速率限制的注册端点。 11. **[auth/password-without-hashing-library](./docs/rules/password-without-hashing-library.md)**: 检测未使用 bcrypt/argon2 处理密码。 12. **[injection/raw-sql-concat](./docs/rules/raw-sql-concat.md)**: 检测原始 SQL 字符串插值。 13. **[headers/missing-security-headers](./docs/rules/missing-security-headers.md)**: 检测 Next.js 配置中缺失的安全标头。 14. **[secrets/next-public-secret](./docs/rules/next-public-secret.md)**: 检测类似 `NEXT_PUBLIC_` 的密钥变量。 15. **[upload/missing-file-type-validation](./docs/rules/missing-file-type-validation.md)**: 检测缺少文件类型验证的上传端点。 16. **[upload/missing-file-size-limit](./docs/rules/missing-file-size-limit.md)**: 检测缺少文件大小限制的上传端点。 17. **[validation/api-route-without-validation](./docs/rules/api-route-without-validation.md)**: 检测可能缺少输入验证的 API 路由。 18. **[auth/admin-route-without-auth](./docs/rules/admin-route-without-auth.md)**: 检测可能缺少身份验证保护的管理员路由。 19. **[config/production-browser-source-maps](./docs/rules/production-browser-source-maps.md)**: 检测 Next.js 配置中的 `productionBrowserSourceMaps: true`。 20. **[config/next-powered-by-header](./docs/rules/next-powered-by-header.md)**: 检测 Next.js 配置中缺少 `poweredByHeader: false`。 ## CLI 用法 推荐的一次性使用方式: ``` npx --yes next-secure-check@latest scan . --preset app ``` 为了实现可重现的 CI 运行,请固定包版本: ``` npx --yes next-secure-check@0.2.0 scan . --preset app ``` 全局安装: ``` npm install -g next-secure-check next-secure-check scan . ``` 如果存在旧的全局安装,无版本的 `npx next-secure-check` 有时会重用旧的二进制文件,并且在 v0.2 选项(如 `--preset`)上失败。请在需要时检查并移除全局安装: ``` next-secure-check --version npm list -g next-secure-check npm uninstall -g next-secure-check npm cache verify ``` 或者无需全局安装即可运行: ``` npx --yes next-secure-check@latest scan . npx --yes next-secure-check@latest scan . --format json npx --yes next-secure-check@latest scan . --format markdown --output report.md npx --yes next-secure-check@latest scan . --format github npx --yes next-secure-check@latest scan . --format sarif --output report.sarif npx --yes next-secure-check@latest scan . --fail-on high npx --yes next-secure-check@latest scan . --fail-on critical npx --yes next-secure-check@latest scan . --category secrets,auth,xss npx --yes next-secure-check@latest scan . --exclude "**/*.test.ts,examples/**" npx --yes next-secure-check@latest scan . --preset app npx --yes next-secure-check@latest scan . --preset strict npx --yes next-secure-check@latest scan . --preset ci node packages/cli/dist/index.js scan . --exclude "**/*.test.ts,examples/**" ``` `--preset` 于 v0.2.0 中添加。建议本地一次性扫描使用 `npx --yes next-secure-check@latest`,或在 CI 中固定 `next-secure-check@0.2.0`。 `--fail-on critical` 是一个风险级别门控。仅当 `scan.summary.riskLevel` 为 `critical` 时,它才以退出码 `1` 退出。`--fail-on high`、`medium`、`low` 和 `info` 继续作为严重性阈值使用。 ## 预设 预设为常见的扫描模式调整路径覆盖范围。它们不能替代手动审查;它们有助于为仓库选择合适的信号/噪声平衡。 | 预设名称 | 最佳用途 | 行为 | | --- | --- | --- | | `default` | 通用本地扫描 | 具有标准上下文调优的广泛基线覆盖 | | `app` | 生产应用代码的合理性检查 | 排除测试、示例、文档、生成输出以及 GitHub 工作流/工具路径 | | `strict` | 激进审查 | 关闭调优并进行广泛扫描 | | `ci` | 拉取请求检查 | 排除测试和生成输出,同时保持面向 CI 的实用行为 | | `audit` | 广泛手动审查 | 关闭调优进行保守审查 | | `library` | 组件/库仓库 | 减少文档/示例/测试/生成内容的噪声 | | `monorepo` | 多应用工作区 | 针对 apps/packages 风格仓库的应用聚焦覆盖 | ## 针对大型仓库的应用聚焦扫描 `next-secure-check` v0.2 作为应用代码的快速审查信号最为有用。大型 monorepo、模板仓库、生成器 CLI、发布脚本以及演示/示例密集型仓库仍然可能产生噪声,但上下文元数据、预设和基于抽象语法树的辅助规则使默认体验更加实用。 对于专注于生产应用代码的扫描,您可以从以下开始: ``` npx --yes next-secure-check@latest scan . --preset app ``` 当您需要更激进的审查模式时,使用 `--preset strict`。当仓库有特定于项目的生成、演示或固定路径时,您仍然可以添加 `--exclude` 模式。发现结果不能替代安全审计;它们是针对常见错误的、集中的发布前审查信号。 ## CLI 配置 CLI 可以从扫描目标根目录读取名为 `.next-secure-check.json` 的本地 JSON 配置文件。 支持的字段: - `excludePaths`: 要忽略的相对路径 glob 模式 - `categories`: 要运行的规则类别 - `failOn`: 严重性阈值,或 `critical` 以基于扫描摘要风险级别进行门控 - `format`: 报告输出格式 - `preset`: 扫描预设(`default`、`app`、`strict`、`ci`、`audit`、`library` 或 `monorepo`) 示例: ``` { "preset": "app", "excludePaths": ["**/*.test.ts", "**/*.spec.tsx", "examples/**"], "categories": ["secrets", "auth", "headers"], "failOn": "high", "format": "json" } ``` 命令行标志始终优先于配置值: ``` CLI flag > config file > default ``` 例如,如果配置文件设置了 `"format": "markdown"` 但命令使用了 `--format json`,CLI 将输出 JSON。 您也可以指定一个明确的配置文件: ``` npx --yes next-secure-check@latest scan . --config path/to/config.json ``` 网页演示不会读取被扫描仓库中的 `.next-secure-check.json` 文件。托管/公共扫描将改用网页演示自身的服务器端选项。 ## SARIF 输出 SARIF 2.1.0 输出可用于 GitHub Code Scanning 等工具: ``` npx --yes next-secure-check@latest scan . --format sarif --output report.sarif ``` SARIF 报告器包括: - 带有 `informationUri` 的工具元数据 - 唯一的规则元数据 - 带有文件、行和列(如可用)的结果位置 - `security-severity` 和精度元数据 - 用于更稳定结果跟踪的确定性 `partialFingerprints` - 基于发现结果标题、描述和推荐构建的简洁结果消息 SARIF 输出中不包含原始密钥证据。 ## Monorepo 布局 ``` apps/ web/ local public-repository web demo app packages/ core/ scanner orchestration, shared types, score engine cli/ command line entrypoint rules/ built-in rule modules reporter/ terminal, JSON, markdown, GitHub, SARIF report output examples/ vulnerable-next-app/ secure-next-app/ docs/ rules/ ``` ## 本地开发 ``` pnpm install pnpm build pnpm typecheck pnpm test ``` 根测试命令当前运行包测试和网页演示测试。 预期的当前测试覆盖率: ``` packages: 231 tests apps/web: 143 tests total: 374 tests ``` 构建后,可以在本地运行 CLI: ``` node packages/cli/dist/index.js scan examples/vulnerable-next-app node packages/cli/dist/index.js scan examples/vulnerable-next-app --format json node packages/cli/dist/index.js scan examples/vulnerable-next-app --format markdown --output report.md node packages/cli/dist/index.js scan examples/vulnerable-next-app --format github --fail-on high node packages/cli/dist/index.js scan examples/vulnerable-next-app --format sarif --output report.sarif node packages/cli/dist/index.js scan . --exclude "**/*.test.ts,examples/**" ``` ## 网页演示状态 网页演示位于 `apps/web` 下。它是一个用于扫描公共 GitHub 仓库的本地演示,而不是生产就绪的托管扫描服务。 当前网页演示流程: ``` Public GitHub repo URL -> URL validation -> public repository metadata check -> tarball download -> safe tarball extraction -> core scanner -> server-side evidence redaction -> cleanup -> report UI -> optional test/example exclusion -> JSON / Markdown export ``` 网页演示包括: - 公共 GitHub 仓库 URL 验证 - 公共仓库元数据检查 - 使用 `User-Agent: next-secure-check` 从 GitHub 下载 tarball - 可选的 `GITHUB_TOKEN` 支持以提高 GitHub API 速率限制 - 带有存档限制和路径检查的安全 tarball 解压 - 解压后临时文件的清理保证 - 扫描成功但立即清理失败时的清理警告行为 - 核心扫描器集成 - 在结果到达浏览器之前的服务器端证据脱敏 - `POST /api/scans` 后端端点 - 包含加载、错误和结果状态的 UI 扫描流程 - **排除测试和示例** 以进行更干净的生产类扫描的开关 - JSON 和 Markdown 导出操作 网页演示有意进行了限制。 它不会: - 访问私有仓库 - 要求登录 - 包含付费 - 运行仓库代码 - 运行 `npm install` - 运行被扫描仓库的构建、测试或包脚本 - 执行动态分析 其目标是仅使用安全的静态分析扫描公共 GitHub 仓库。与密钥相关的证据在网页响应和导出之前会在服务端进行脱敏。 默认情况下,网页演示可以排除测试/规范文件和 `examples/**`: ``` **/*.test.ts **/*.test.tsx **/*.spec.ts **/*.spec.tsx examples/** ``` 运行本地网页演示: ``` pnpm install pnpm build pnpm -C apps/web dev ``` 然后打开本地 Next.js 应用并输入一个公共 GitHub 仓库 URL。 扫描 API 接受: ``` POST /api/scans Content-Type: application/json { "repoUrl": "https://github.com/owner/repo", "excludePaths": ["**/*.test.ts", "examples/**"] } ``` 真实的本地 API 冒烟测试通过: ``` https://github.com/octocat/Hello-World ``` ## 安全模型/加固 网页演示仅设计用于公共、静态扫描: - 仅限公共仓库 - 不执行被扫描仓库的脚本 - 不在被扫描仓库内安装依赖 - 下载前进行 GitHub 仓库元数据和大小检查 - 带有存档限制的安全 tarball 解压 - 路径遍历保护 - 拒绝符号链接和硬链接 - 拒绝重复的存档路径 - 服务器端密钥证据脱敏 - 可选的 `GITHUB_TOKEN` 支持用于 GitHub 元数据和 tarball 请求 - GitHub 请求使用 `User-Agent: next-secure-check` - 可选的 Upstash Redis REST 分布式扫描防护 - 内存中的 IP 速率限制和全局并发防护回退 - 强化的客户端 IP 解析器,具有平台头优先、IPv4/IPv6 验证和大头部回退 - GitHub 请求和扫描阶段超时及安全错误响应 - 针对旧扫描器解压目录的孤立临时文件清理 - 即使立即清理失败,成功的扫描结果仍然返回,并带有安全的清理警告 内存中的扫描防护仅适用于本地/单实例演示阶段。公共多实例或无服务器部署应配置分布式防护或等效的平台级保护。 ## 已知限制 - 规则是确定的,并结合了轻量级模式匹配、语法级抽象语法树检查和路径/上下文信号,因此仍然可能产生误报和漏报。 - 发现结果是审查信号,而不是漏洞利用的证明。 - 大型 monorepo、演示/示例密集型仓库、模板仓库和工具导向型仓库仍然可能产生噪声发现。 - 即使行为对于工具是有意的,命令行生成器和发布/工具脚本也可能触发命令执行发现。 - 完全的类型感知分析是 v0.3 的路线图项目。 - 内存中的扫描防护仅作为本地/单实例回退。 - 公共部署应使用可选的 Upstash/分布式防护或等效的平台级保护。 - 基于 IP 的限制依赖于受信任的代理/平台转发头。 - 网页演示仅扫描公共仓库,并且不运行仓库代码。 ## GitHub Actions 本地终端扫描是手动的:`next-secure-check` 仅在您执行 CLI 时运行。GitHub Actions 扫描在您将工作流文件添加到仓库后是自动的;然后 GitHub 在配置的推送或拉取请求事件上运行扫描。该工具不会自行扫描仓库。 要获取基本的步骤摘要工作流,请将以下内容复制到 `.github/workflows/next-secure-check.yml` 中: ``` name: next-secure-check on: pull_request: push: branches: [main] permissions: contents: read jobs: security-check: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 20 - name: Run next-secure-check shell: bash run: | set -o pipefail npx --yes next-secure-check@0.2.0 scan . --preset app --format github --fail-on high | tee -a "$GITHUB_STEP_SUMMARY" ``` 当发现严重级别为 `HIGH` 或以上的发现结果时,这将使拉取请求失败。如果您的团队需要更严格的严重性门控,请将 `--fail-on` 更改为 `medium`、`low` 或 `info`。当您仅希望在扫描摘要风险级别为 `critical` 时失败时,请使用 `--fail-on critical`。 对于 GitHub Code Scanning,请生成 SARIF 并上传: ``` name: next-secure-check SARIF on: pull_request: push: branches: [main] permissions: contents: read security-events: write jobs: security-check: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 20 - name: Run next-secure-check SARIF run: npx --yes next-secure-check@0.2.0 scan . --preset app --format sarif --output next-secure-check.sarif - name: Upload SARIF uses: github/codeql-action/upload-sarif@v3 with: sarif_file: next-secure-check.sarif ``` 发现结果是确定的模式匹配,而不是漏洞利用的证明。在将发现结果视为已确认的漏洞之前,请审查 `confidence`、`evidence` 和 `recommendation` 字段。 ## 验证说明 手动验证说明: - [第 4 阶段验证](./docs/validation/phase-4-validation.md) - [第 4.5 阶段验证](./docs/validation/phase-4-5-validation.md) - [第 6 阶段外部审查修复](./docs/validation/phase-6-external-review-fixes.md) ## v0.3 路线图 - 针对需要更深层数据流上下文的规则,进行完整的类型感知分析。 - 更深层的 XSS 清理器和源分析。 - 路由图和中间件感知的身份验证检测。 - 更好的 `unknown` 上下文分类。 - 自定义规则配置和规则启用/禁用控制。 - 网页演示的基于 Nonce/哈希的 CSP 加固。 - 公共托管演示加固。 - 更多的 GitHub Code Scanning 集成示例。 - 规则噪声减少和误报跟踪。 - VS Code 扩展或 ESLint 插件探索。 ## 发布门控 ``` CLI works before web. Tests pass before NPM release. GitHub Action works before SaaS. Real user feedback comes before payments. ``` ## 许可证 [MIT 许可证](./LICENSE)
标签:API路由安全, AST辅助分析, GitHub Actions集成, MITM代理, Next.js安全, npm包, SARIF报告, SQL注入检测, XSS风险检测, 上传安全, 仓库扫描, 图数据库, 安全头检查, 安全检查, 开发安全工具, 暗色界面, 确定性规则, 秘密泄露检测, 自动化攻击, 速率限制检查, 配置安全, 静态分析工具, 静态安全扫描, 预设扫描