PHP 写了个页面,如果访问来自私有 IP 地址就允许。家里的 ip 是 192.168.1.0/24 网段的。今天发现一个漏洞,在朋友家访问我这个页面,居然可以打开。查看 ip 发现是 10.15.25.81 。
我知道只要改成 192.168.0.0/16 网段就可以了,但是也不能保证运营商分配 192.168.0.0/16 给其他用户,虽然大概率不太可能大内网用 C 类私有地址。
<?php
if (isset($_SERVER["HTTP_CF_CONNECTING_IP"])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
}
$ip = $_SERVER["REMOTE_ADDR"];
//local access OR from my IP(through Cloudflare)
if (
(!(filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE)))//check local ip
||
($ip == gethostbyname('my.ddns.me'))//check public ip
)
{
//do nothing;
}
else{
//go error page
echo "No access";
?>
1
opengps 2023-04-27 09:13:31 +08:00 3
这里似乎有个伪需求,如果仅允许私有地址打开,何必暴露端口到公网呢?
|
2
doveyoung 2023-04-27 09:39:40 +08:00
你杀死了比赛
|
3
911061873 2023-04-27 11:23:16 +08:00
都是内网的服务了,直接从网络层面就可以拒绝外网访问的问题,不把服务暴露在公网不就好了?
|
4
laozhoubuluo 2023-04-27 14:29:22 +08:00
因为有时候会通过 XFF 等第三方头透传内网 IP 导致出问题,最省事的改法应该是去掉 HTTP_CF_CONNECTING_IP 可以覆盖 REMOTE_ADDR 的逻辑,只信任底层上报的 IP 地址即 REMOTE_ADDR 。
|
5
busier 2023-05-01 14:42:07 +08:00
楼上讲明了原因!
但是 1 楼才是最优解! |