问题描述
01-PRODUCT.md §3.1 已明确将 isLocalRequest() 标记为 已弃用("will be removed entirely, with its 3 call sites replaced by correct alternatives"),并关联 issue #89。然而,新提交的 /status 端点新增了第 4 个调用点:
$isLocal = isLocalRequest(); // 新增调用,与弃用计划相悖
现状
| 调用点 |
现有行为 |
问题 |
计划替代方案 |
| line 1172: HSTS header |
非本地 → 发送 HSTS |
代理后 REMOTE_ADDR 是内网 IP,生产环境永远不会发送 HSTS |
Nginx 配置处理 |
| line 1423: server version |
本地 → 显示 SERVER_SOFTWARE |
代理后任何请求都显示版本信息 |
Nginx server_tokens off |
?debug=1 debug 模式 |
本地 → 允许敏感信息 |
代理后任何请求都可触发 debug |
PHPMAN_DEBUG=true env var |
新: /status endpoint |
本地 → 跳过 MCP_API_KEY 校验 |
同上,重新引入同一问题 |
需要决定替代方案 |
影响
isLocalRequest() 在反向代理(Nginx 等)部署下不可靠——此时 REMOTE_ADDR 始终是代理的内网 IP,意味着生产环境下 /status 可能会被:
- 无 key 参数也允许访问(如果部署在代理后面)
- 或者无 key 参数也拒绝访问(取决于判断)
两种结果都不是正确的安全语义——安全判断应基于显式的 key 校验,而非从 IP 推断。
建议
选项 A(推荐): 将本地判断替换为显式的 PHPMAN_STATUS_ALLOW_LOCAL=true 环境变量检查,配合 REMOTE_ADDR === "127.0.0.1" || REMOTE_ADDR === "::1" 硬检查作为辅助。
选项 B(最低改动): 在 01-PRODUCT.md §3.1 的 isLocalRequest 清退表中增加 /status 调用点,关联同一 issue #89。
关联
问题描述
01-PRODUCT.md§3.1 已明确将isLocalRequest()标记为 已弃用("will be removed entirely, with its 3 call sites replaced by correct alternatives"),并关联 issue #89。然而,新提交的/status端点新增了第 4 个调用点:现状
REMOTE_ADDR是内网 IP,生产环境永远不会发送 HSTSserver_tokens off?debug=1debug 模式PHPMAN_DEBUG=trueenv var/statusendpoint影响
isLocalRequest()在反向代理(Nginx 等)部署下不可靠——此时REMOTE_ADDR始终是代理的内网 IP,意味着生产环境下/status可能会被:两种结果都不是正确的安全语义——安全判断应基于显式的 key 校验,而非从 IP 推断。
建议
选项 A(推荐): 将本地判断替换为显式的
PHPMAN_STATUS_ALLOW_LOCAL=true环境变量检查,配合REMOTE_ADDR === "127.0.0.1" || REMOTE_ADDR === "::1"硬检查作为辅助。选项 B(最低改动): 在
01-PRODUCT.md§3.1 的isLocalRequest清退表中增加/status调用点,关联同一 issue #89。关联
isLocalRequest清退计划01-PRODUCT.md§3.1