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开发, 安全防御评估, 版权保护, 请求拦截, 错误诊断