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

关联

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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