Skip to content

New /status endpoint uses deprecated isLocalRequest() #217

Description

@chedong

问题描述

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

关联

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions