PHPアクセス制限ipホワイトリスト

6539 ワード

1つ上のコード
  config.php
    //ip     
        'ipWlist'=>[
            'ifFilter'=>true,   //         
            'wlist'=>[
                '10.0.0.19',
            ],
            'warea1'=>'10.8.0.0/16',     //     1
            'warea2'=>'10.12.0.0/16',     //     1
        ],

 
  commonfunc.php
private function checkIp(){
        $user_IP = ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];
        $user_IP = ($user_IP) ? $user_IP : $_SERVER["REMOTE_ADDR"];
        $ipC=config('appconf.ipWlist');
        if(!$ipC['ifFilter']){
            return true;
        }
        if(in_array($user_IP, $ipC['wlist'])){
            return true;
        }
        if( ! $this->ip_in_network($user_IP, $ipC['warea1'])){
            if( ! $this->ip_in_network($user_IP, $ipC['warea2'])){
                return false;
            }
        }
        return true;
    }

    private function  ip_in_network($ip, $network)
    {
        $ip = (double) (sprintf("%u", ip2long($ip)));
        $s = explode('/', $network);
        $network_start = (double) (sprintf("%u", ip2long($s[0])));
        $network_len = pow(2, 32 - $s[1]);
        $network_end = $network_start + $network_len - 1;

        if ($ip >= $network_start && $ip <= $network_end)
        {
            return true;
        }
        return false;
    }

二説明
2.1 ipの取得方法
  • $_SERVER["HTTP_VIA"]エージェントサーバがある場合は、エージェントサーバIPを示す.
  • $_SERVER["HTTP_X_FOrWARDED_FOR"]は、プロキシサーバを介してクライアントの実際のIPアドレスを取得する.
  • $_SERVER["REMOTE_ADDR"]現在のページユーザのIPアドレスを閲覧している一般的に、開発者は内部のサーバアーキテクチャについてよく知っており、簡単で乱暴なREMOTE_ADDRでいい、REMOTE_ADDRは偽造できない、より安全で、他の2つのフィールドはそんなに頼りにならない.
     
    2.2ある子供靴は配列のconfigではなくdefineで
     
    json_を使うことができますEncode,シーケンス化,eval()などの方法で解決し,以下のようにする.
    define("IPFILTER",1);  
    define('IPWLISTJSON',json_encode(['127.0.0.1',]));

    //
    $wlist = json_decode(IPWLISTJSON,1);
    define('IPWLIST',"return ['127.0.0.1',];");
    //    
    $wlist=eval(IPWLIST)
    define('IPWLIST',serialize(['127.0.0.1',]));

    //
    $wlist=unserialize(IPWLIST);

    string特殊区切り記号のexplode形式なども使えますが、ここでは一つ一つ例を挙げません