首頁  >  文章  >  後端開發  >  PHP實作IP黑白名單過濾

PHP實作IP黑白名單過濾

巴扎黑
巴扎黑原創
2016-11-23 10:56:001618瀏覽

  需求來自一個維運的同事,對一個php檔案執行進行IP過濾,不方便直接設定伺服器,於是需要直接在php檔案開頭進行IP的過濾。 
    IP過濾規則,可以有以下形式: 
    1.完整的IP位址 如:192.168.0.1  
    2.某一段IP 如:192.168.0.* 。 
    維運可自訂IP黑白名單,由多個IP過濾規則組成,保存在陣列中。透過編寫程式碼,實現IP黑白名單功能。一個比較簡單的需求。
    先實現一個函數,功能是判斷ip是否符合某個ip過濾規則:

function ip_test($ip,$iprule){
   $ipruleregexp=str_replace('.*','ph',$iprule);
   $ipruleregexp=preg_quote($ipruleregexp,'/');
   $ipruleregexp=str_replace('ph','\.[0-9]{1,3}',$ipruleregexp);
   if(preg_match('/^'.$ipruleregexp.'$/',$ip)) return true;
   else return false;
   
}

    實現了ip_test這個核心函數後,下面的過程就簡單多了,無非就是簡單的遍歷名單中的每條規則,判斷目前連線的IP是否符合規則,並進行對應的步驟。
     白名單,當IP至少滿足一條規則時繼續執行操作 
    

 $curr_ip=$_SERVER['REMOTE_ADDR'];
     $white_list=array(...); //白名单规则
     $test_success=false;
     foreach($white_list as $iprule){
        if(ip_test($curr_ip,$iprule)){
           $test_success=true;
           break;
        }
     }
     if(!$test_success) exit('IP not in white list');

黑名單,當IP不滿足所有規則時繼續執行操作 

 $curr_ip=$_SERVER['REMOTE_ADDR'];
     $black_list=array(...); //黑名单规则
     foreach($black_list as $iprule){
        if(ip_test($curr_ip,$iprule)){
           exit('IP in black list');
        }
     }

   。這篇部落格主要是給那些主業務不是開發的人員,如:技術支援、維運等。由於太簡單,原本不想寫,後來那個同事感謝我幫忙,對我說這個他在網上找了很久,都沒有找到合適的解決方案,我就想說不定這個還真有人需要呢。  

 

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn