IP白名單的實現(PHP)


有些項目可能會用到一個IP地址的白名單黑名單之類的驗證。

比如,只有IP地址在白名單中,才可以訪問該系統。

那么此時,白名單的維護,一般是一個文件,里邊是一些IP地址(每行一個IP),當然也有的可能是用數據庫記錄白名單。

當然,即使放在數據庫中記錄(方便管理),也可以在后台根據數據庫生成IP白名單的配置文件,每次更新白名單時,都根據數據庫數據,重新寫一下白名單的配置文件。

這里,假設白名單的IP地址是存儲在一個文件中:while_ips.conf

一般常見的兩種情況:一種是白名單文件中的所有IP都是完整的,另一種是有的IP是有范圍的(帶.*)

 

一、每一個IP都是完整的IP

1 127.0.0.0
2 192.168.1.1
3 192.168.1.2
4 192.168.1.30
5 123.200.20.200
6 123.101.21.201

  以上假設就是IP白名單。

此時的思路是,從文件中讀取所有IP地址寫入一個數組,每行就是一個元素。

然后判斷當前IP是否在這個數組中。這樣就實現了這個IP是不是在白名單的驗證。

這種實現,比較簡單。

 1 function white_ips($file)
 2 {
 3     $a = [];
 4     if (is_file($file)) {// 判斷是不是文件
 5         $f = fopen($file, 'r');// 只讀的方式打開文件
 6         while (!feof($f)) {// 判斷你是否在文件尾,不是文件尾則循環
 7             $s = fgets($f);// 每次讀出一行
 8             $s = preg_replace('/\s*/', '', $s);// 先過濾掉多余的空格和空白
 9             if (substr($s, 0, 1) != '#' && $s != '') {// 如果不是注釋行,或者空行
10                 $a[] = $s;// 記錄有效數據
11             }
12         }
13         fclose($f);
14     }
15     return $a;
16 }

  $file是IP白名單文件的存儲位置和文件名,其中會過濾掉注釋的IP,同時也會過濾掉多余的空白和換行。避免意外出錯。

1 $arr = getWhiteIps('white_ips.conf');
2 $ip = '192.168.1.1';
3 $allow = 0;
4 if (in_array($ip, $arr)) {
5     $allow = 1;
6 }
7 echo $allow;

  通過這樣調用和判斷,就可以知道當前的IP是否在白名單了。

 

二、第二種情況是白名單配置文件中是有范圍的

 1 127.*.*.*
 2 10.*.*.*
 3 192.168.*. *
 4 192.168.1.1
 5 123.200.20.200
 6 123.101.21.201
 7 210.10.22.*
 8 210.123.135.*
 9 #30.11.22.33
10 #119.123.2.15

  以上是假設IP白名單的文件內容

  此時的思路是,從文件中讀取所有IP地址寫入一個數組,每行就是一個元素。

  然后通過循環的方式,將當前IP和數組中的每一條數據進行比較(匹配),如果匹配上則白名單,否則不是。

  此時因為有范圍,所以不能使用in_array這種簡單的判斷了。需要使用正則來判斷。

  讀取白名單配置文件的代碼不變,改變判斷方法即可。

 1 function checkIp($ip, $rule)
 2 {
 3     $rule_regexp = str_replace('.*', 'a', $rule);//將.*臨時替換成別的符號(.和*都是正則中有特殊含義的符號)
 4     $rule_regexp = preg_quote($rule_regexp, '/');//向規則字符串中增加轉義,避免字符串中有其他特殊字符影響正則匹配,非必要語句本例可以忽略
 5     $rule_regexp = str_replace('a','\.\d{1,3}', $rule_regexp);//將臨時符號替換成正則表達式
 6     if(preg_match('/^' . $rule_regexp . '$/', $ip)){
 7         return 1;//匹配
 8     }else{
 9         return 0;//不匹配
10     }
11 }
12 
13 $arr = getWhiteIps('white_ips.conf');
14 $ip = '192.168.1.';
15 $allow = 0;
16 foreach ($arr as $rule) {
17     if(checkIp($ip, $rule)){
18         $allow = 1;//找到一個排配則標記白名單,然后結束循環
19         break;
20     }
21 }
22 echo $allow;

  這種有范圍的驗證,稍微復雜一點,需要逐一比對判斷。利用正則匹配IP后,結束循環。

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM