|
环境:Debian、宝塔 Nginx、PHP-FPM 8.4、Laravel 13。宝塔面板版本/Nginx 版本/免费防火墙版本:[8.4]。 问题已多次复发,影响不同的 POST 业务,而非单个网页:
- 商品下单:提示购买数量缺失。2026-10-12 18:35:13(北京时间),请求 Content-Length 为 293 字节,应用入口读取的原始请求体长度为 0,gid、数量、邮箱等字段全部缺失。
- 后台卡密导入:同时提示分类 ID、商品 ID、规格 ID,以及卡密文本或文件缺失。
- 后台订单批量删除:从列表点击删除后出现 405。该表单使用 POST 加隐藏的 _method=DELETE;怀疑正文丢失时方法覆盖字段也随之丢失。
故障期间,我在服务器上使用 curl 的 --resolve 将域名直连 127.0.0.1,绕过 Cloudflare,发送包含 gid、数量等字段的小型表单,并故意使用无效 CSRF,确保不会创建订单:
- 2026-10-12 18:39:52,flow_id=7015062abf1ce78f1f37328ee9ddb599:Content-Length=106,应用读取的 raw_body_length=0,PHP 和 Laravel 均未收到表单字段。
- 随后关闭宝塔免费 Nginx 防火墙;2026-10-12 18:41:30,flow_id=66e24da51ba256a41423c3b6c0d42085:相同类型的直连探针 Content-Length=106、raw_body_length=106,gid、数量等字段完整到达。
- 两次探针均返回 HTTP 419,这是故意使用无效 CSRF 的预期结果;判断依据是正文长度和字段是否到达,而非 419 状态码。
- 关闭插件后,下单、卡密导入、订单批量删除三种操作均恢复正常。此前把 /create-order 加入 URL 白名单仍会复发,白名单不能作为有效修复。
目前证据强烈指向免费防火墙所在的 Nginx/Lua 请求处理链路;但关闭插件也可能触发 Nginx 重载,因此希望开发者同时核查插件处理请求体的逻辑,以及重载后暂时恢复的原因。故障期间未发现对应的防火墙拦截记录,请求仍进入 PHP,只是正文为空。
请协助确认是否为已知问题,给出需要补充的非敏感诊断信息、兼容配置或修复版本。在修复并验证前,我只能保持该免费插件关闭,以保证订单业务可用。
|