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