点路径拦截
OxPHP 会拦截对任何 URL 路径的访问,只要其中某个路径段以 . 开头,就返回 404 Not Found。这可以防止 .env、.git/、.htaccess、.svn/ 和 .DS_Store 等敏感文件被泄露,而这些文件正是自动化扫描器常见的攻击目标。
这项保护始终开启,无法禁用。它适用于所有路由模式(传统模式、框架模式、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 进行规范化,那么单次解码就足够了。
另见
- 路由 —— 路由模式与路径安全