点路径拦截

OxPHP 会拦截对任何 URL 路径的访问,只要其中某个路径段以 . 开头,就返回 404 Not Found。这可以防止 .env.git/.htaccess.svn/.DS_Store 等敏感文件被泄露,而这些文件正是自动化扫描器常见的攻击目标。

Note

这项保护始终开启,无法禁用。它适用于所有路由模式(传统模式、框架模式、SPA 和工作进程模式)。

哪些内容会被拦截

只要请求中有一个路径段以 . 开头,就会返回 404:

请求 结果
/.env 404
/.git/config 404
/.htaccess 404
/.DS_Store 404
/.docker/config.json 404
/path/.hidden/file.txt 404
/path/to/.env 404

单层百分号编码的绕过尝试同样会被拦截:/%2egit/HEAD 会先解码一次得到 /.git/HEAD,随后被拒绝。

.well-known 例外

RFC 8615/.well-known/ 定义为存放站点级元数据的标准位置。OxPHP 允许访问 .well-known 下的子路径,但有一些限制:

请求 结果
/.well-known/security.txt 作为静态文件提供
/.well-known/acme-challenge/token 作为静态文件提供(Let's Encrypt)
/.well-known/openid-configuration 文件存在则提供,否则回退到 ENTRY_FILE 或返回 404
/.well-known 404(裸路径)
/.well-known/ 404(目录列表)
/.well-known/test.php 404(PHP 执行被拦截)

.well-known 内的 PHP 文件永远不会被执行——它们始终返回 404。该目录只提供静态内容。

MIME 类型由文件扩展名决定。没有扩展名的文件(例如 openid-configuration)会以 application/octet-stream 提供。

局限性

双重编码的输入(/%252egit/HEAD)只会被解码一次,结果仍为 /%2egit/HEAD,因此这一层不会将其识别为点路径段。标准的 HTTP 客户端和浏览器不会进行双重编码,所以这在实践中很少造成问题;如果你的上游代理在转发之前会对 URI 进行规范化,那么单次解码就足够了。

另见

  • 路由 —— 路由模式与路径安全