php - 本地主机的防弹测定
问题描述
我知道这似乎微不足道,也许确实如此,但我想知道确定脚本是否在本地主机上执行的最佳方法是什么。
到目前为止,当我必须执行不同的逻辑时,我使用了以下区别,具体取决于脚本是否在本地执行:
if ( $_SERVER['REMOTE_ADDR'] === '127.0.0.1' || $_SERVER['REMOTE_ADDR'] === '::1' ) {
// localhost-only stuff here (like different routing etc)
}
当我第一次使用它时,我检查了明显的可能性,例如:
- 127.0.0.1/foo.php
- 127.0.0.1:80/foo.php
- http://127.0.0.1/foo.php
- http://127.0.0.1:80/foo.php
- https://127.0.0.1/foo.php
- https://127.0.0.1:443/foo.php
- 本地主机/foo.php
- 本地主机:80/foo.php
- http://localhost/foo.php
- http://localhost:80/foo.php
- https://localhost/foo.php
- https://localhost:443/foo.php
由于该声明适用于所有这些变体,因此我不再关心这一点。与此同时,我注意到这并没有真正涵盖所有情况,例如,当使用主机名本身时
- http://mycomputer/foo.php
因为$_SERVER['REMOTE_ADDR']将不包含环回但本地链接 ip(如 fe80:... 等)。这让我想到了一个问题,是否有一个简单/安全/快速的解决方案真正涵盖了访问 localhost 的所有可能方式,因为我确信可能会出现很多其他变体。
// 编辑:只要脚本在 localhost 上运行比在 webhost 上运行时可能采用另一个执行路径,就不需要获取客户端 ip。例如在不使用虚拟主机或类似的东西的情况下应用不同的文档根路径
// Edit2:目前,似乎没有比检查所有可能的远程地址更好的解决方案,如下所示:
if ( $_SERVER['REMOTE_ADDR'] === '127.0.0.1' ||
$_SERVER['REMOTE_ADDR'] === '::1' ||
str_starts_with($_SERVER['REMOTE_ADDR'], 'fe80:') ||
str_starts_with($_SERVER['REMOTE_ADDR'], '169.254.') ) {
// running on localhost
}
解决方案
推荐阅读
- python - 在 iPad 应用上使用 venv:“Pyto - Python 3”
- javascript - ajax 和 php 返回 json 异常
- python - 保存然后使用 Python 启动 Excel 文件
- laravel - 如何在 Laravel Spatie 媒体库中从磁盘添加多个媒体?
- signal-processing - Qualcomm DSP:带有命令行参数的 hexagon-sim
- security - 如何保护 indexedDB 中不可提取的密钥?
- javascript - 如果我刷新页面,在浏览器中重复循环再次显示相同的数据
- spring-mvc - javax.servlet.ServletException: SRVE0207E: 未捕获的由 servlet 创建的初始化异常
- pytorch - 自定义 Jacobian 实现给出了不同的损失值
- java - 使用 Graphql - com.graphql-java-kickstart 和 spring webflux 返回类型