V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
serafin
V2EX  ›  宽带症候群

PHP 写了个页面,如果访问来自私有 IP 地址就允许

  •  
  •   serafin · 362 天前 · 1484 次点击
    这是一个创建于 362 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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";
    ?>
    
    5 条回复    2023-05-01 14:42:07 +08:00
    opengps
        1
    opengps  
       362 天前   ❤️ 3
    这里似乎有个伪需求,如果仅允许私有地址打开,何必暴露端口到公网呢?
    doveyoung
        2
    doveyoung  
       362 天前
    你杀死了比赛
    911061873
        3
    911061873  
       362 天前
    都是内网的服务了,直接从网络层面就可以拒绝外网访问的问题,不把服务暴露在公网不就好了?
    laozhoubuluo
        4
    laozhoubuluo  
       362 天前
    因为有时候会通过 XFF 等第三方头透传内网 IP 导致出问题,最省事的改法应该是去掉 HTTP_CF_CONNECTING_IP 可以覆盖 REMOTE_ADDR 的逻辑,只信任底层上报的 IP 地址即 REMOTE_ADDR 。
    busier
        5
    busier  
       358 天前
    楼上讲明了原因!
    但是 1 楼才是最优解!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5270 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 09:37 · PVG 17:37 · LAX 02:37 · JFK 05:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.