有些項目可能會用到一個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后,結束循環。