codelift-dev/laravel-error-lab

GitHub: codelift-dev/laravel-error-lab

在 Docker 中逐变量复现 Laravel 典型运行时错误(419、Vite manifest 等),并提供精确诊断工具帮助开发者区分根因。

Stars: 0 | Forks: 0

# laravel-error-lab Laravel 运行时错误的重现,在 Docker 中运行,并保留了输出结果。 每个场景都从一个干净的应用程序开始,并且每次只更改**一个变量**, 因此结果不会是某人本地环境的产物。 ## `419 页面已过期` 重现了六种不同的原因。**这六种情况都会产生字节完全相同的 响应** —— 相同的状态码、相同的页面,没有任何东西可以将它们区分开来: | 原因 | HTTP | |---|---| | 表单没有 `@csrf` | 419 | | Token 格式错误 | 419 | | Token 有效,但未发送 session cookie | 419 | | Token 由不同的 session 生成 | 419 | | 表单加载后轮换了 `APP_KEY` | 419 | | Session 在服务端过期 | 419 | | 在 `api` 组路由上的同一个 POST 请求 | **200** | 这就是为什么“可以尝试的 5 件事”之类的建议毫无用处:它列出了各种修复方法, 却没有任何途径找出哪一种适用于你的情况。 因此,后半部分构建了一个诊断工具来对原因进行分类,然后 **重放所有六个场景,以确认分类是正确的**, 而不仅仅是看似合理。结果发现有两个要求是必须满足的, 而且这两个要求都是在首先弄错之后才发现的: - 检查必须在 **`StartSession` 之前运行** —— 当异常 处理器看到请求时,`EncryptCookies` 已经将无法解密的 cookie 置空,而 `StartSession` 已经生成了一个替代的 session,这 会将“轮换的 key”和“过期的 session”混淆为“token 不匹配” - render 回调 **不能以 `TokenMismatchException` 为类型提示** —— 它 永远不会触发,因为在查询回调之前,`prepareException()` 已经将其重写为 `HttpException(419)` 将 `work/CsrfDiagnosis.php` 和 `work/DiagnoseCsrf.php` 按原样复制到应用程序中; `work/install-diagnosis.php` 展示了如何进行注册。 完整文章: ## `未找到 Vite manifest` 六个场景,而大家都给出的建议 —— “运行 `npm run build`” —— 只能解决 其中的一个。这六个中有两个 **返回 HTTP 200 且不抛出任何异常**: | 原因 | HTTP | Exception | |---|---|---| | `public/build` 被删除 | 500 | `ViteManifestNotFoundException` | | **遗留了 `public/hot`** | **200** | **无** | | 遗留了 `public/hot`,没有 build | **200** | **无** | | manifest 仅存在于 `public/build/.vite/` | 500 | `ViteManifestNotFoundException` —— *消息完全相同* | | `@vite()` 指向了缺失的入口 | 500 | `ViteException` | hot-file 的情况是最浪费时间的:页面正常渲染,状态码为 200,日志保持空白,而浏览器却默默地被告知去一个未运行的 dev server 获取静态资源。**`npm run build` 不会删除 `public/hot`** —— 这是经过实际测量的,而非假设 —— 因此标准的建议无法修复它。 完整文章: ## 运行它 ``` docker compose build docker compose run --rm lab bash 419-page-expired.sh # reproduce every 419 cause docker compose run --rm lab bash 419-diagnose.sh # classify every 419 cause docker compose run --rm lab bash vite-manifest.sh # reproduce every Vite case docker compose run --rm lab bash vite-manifest-detail.sh # exact exception text ``` 宿主机上无需安装任何东西。服务器和客户端都在 容器内运行,因此没有端口冲突,也不涉及宿主机的 PHP。 已在 Laravel **13.21.1** / PHP 8.4.23 (419) 和 Laravel **13.23.0** / PHP 8.4.24 / Node 22.23.2 (Vite) 上验证。详情,以及曾短暂导致两个 错误结论的测试框架 bug:[VERIFICATION.md](VERIFICATION.md)。 [CodeLift](https://codelift.lb-product.com) 的一部分 —— 我们在 Docker 中验证官方示例 代码,并发布实际运行的结果。
标签:CSRF, Docker, Laravel, MITM代理, OpenVAS, PHP, Syscall, Web开发, 安全防御评估, 版权保护, 请求拦截, 错误诊断