V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
serafin

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

  •  
  •   serafin · Apr 27, 2023 · 2194 views
    This topic created in 1108 days ago, the information mentioned may be changed or developed.

    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 replies    2023-05-01 14:42:07 +08:00
    opengps
        1
    opengps  
       Apr 27, 2023   ❤️ 3
    这里似乎有个伪需求,如果仅允许私有地址打开,何必暴露端口到公网呢?
    doveyoung
        2
    doveyoung  
       Apr 27, 2023
    你杀死了比赛
    911061873
        3
    911061873  
       Apr 27, 2023
    都是内网的服务了,直接从网络层面就可以拒绝外网访问的问题,不把服务暴露在公网不就好了?
    laozhoubuluo
        4
    laozhoubuluo  
       Apr 27, 2023
    因为有时候会通过 XFF 等第三方头透传内网 IP 导致出问题,最省事的改法应该是去掉 HTTP_CF_CONNECTING_IP 可以覆盖 REMOTE_ADDR 的逻辑,只信任底层上报的 IP 地址即 REMOTE_ADDR 。
    busier
        5
    busier  
       May 1, 2023
    楼上讲明了原因!
    但是 1 楼才是最优解!
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3115 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 13:44 · PVG 21:44 · LAX 06:44 · JFK 09:44
    ♥ Do have faith in what you're doing.