vb.net 判断是否为ip 正则_PHP实现IP白名单
有些項目可能會用到一個IP地址的白名單黑名單之類的驗證。
比如,只有IP地址在白名單中,才可以訪問該系統(tǒng)。
那么此時,白名單的維護,一般是一個文件,里邊是一些IP地址(每行一個IP),當(dāng)然也有的可能是用數(shù)據(jù)庫記錄白名單。
當(dāng)然,即使放在數(shù)據(jù)庫中記錄(方便管理),也可以在后臺根據(jù)數(shù)據(jù)庫生成IP白名單的配置文件,每次更新白名單時,都根據(jù)數(shù)據(jù)庫數(shù)據(jù),重新寫一下白名單的配置文件。
這里,假設(shè)白名單的IP地址是存儲在一個文件中:while_ips.conf
一般常見的兩種情況:一種是白名單文件中的所有IP都是完整的,另一種是有的IP是有范圍的(帶.*)
一、每一個IP都是完整的IP
127.0.0.0 192.168.1.1 192.168.1.2 192.168.1.30 123.200.20.200 123.101.21.201以上假設(shè)就是IP白名單。
此時的思路是,從文件中讀取所有IP地址寫入一個數(shù)組,每行就是一個元素。
然后判斷當(dāng)前IP是否在這個數(shù)組中。這樣就實現(xiàn)了這個IP是不是在白名單的驗證。
這種實現(xiàn),比較簡單。
function white_ips($file) {$a = [];if (is_file($file)) {// 判斷是不是文件$f = fopen($file, 'r');// 只讀的方式打開文件while (!feof($f)) {// 判斷你是否在文件尾,不是文件尾則循環(huán)$s = fgets($f);// 每次讀出一行$s = preg_replace('/s*/', '', $s);// 先過濾掉多余的空格和空白if (substr($s, 0, 1) != '#' && $s != '') {// 如果不是注釋行,或者空行$a[] = $s;// 記錄有效數(shù)據(jù)}}fclose($f);}return $a; }$file是IP白名單文件的存儲位置和文件名,其中會過濾掉注釋的IP,同時也會過濾掉多余的空白和換行。避免意外出錯。
$arr = getWhiteIps('white_ips.conf'); $ip = '192.168.1.1'; $allow = 0; if (in_array($ip, $arr)) {$allow = 1; } echo $allow;通過這樣調(diào)用和判斷,就可以知道當(dāng)前的IP是否在白名單了。
二、第二種情況是白名單配置文件中是有范圍的
127.*.*.* 10.*.*.* 192.168.*. * 192.168.1.1 123.200.20.200 123.101.21.201 210.10.22.* 210.123.135.* #30.11.22.33 #119.123.2.15以上是假設(shè)IP白名單的文件內(nèi)容
此時的思路是,從文件中讀取所有IP地址寫入一個數(shù)組,每行就是一個元素。
然后通過循環(huán)的方式,將當(dāng)前IP和數(shù)組中的每一條數(shù)據(jù)進行比較(匹配),如果匹配上則白名單,否則不是。
此時因為有范圍,所以不能使用in_array這種簡單的判斷了。需要使用正則來判斷。
讀取白名單配置文件的代碼不變,改變判斷方法即可。
function checkIp($ip, $rule) {$rule_regexp = str_replace('.*', 'a', $rule);//將.*臨時替換成別的符號(.和*都是正則中有特殊含義的符號)$rule_regexp = preg_quote($rule_regexp, '/');//向規(guī)則字符串中增加轉(zhuǎn)義,避免字符串中有其他特殊字符影響正則匹配,非必要語句本例可以忽略$rule_regexp = str_replace('a','.d{1,3}', $rule_regexp);//將臨時符號替換成正則表達式if(preg_match('/^' . $rule_regexp . '$/', $ip)){return 1;//匹配}else{return 0;//不匹配} }$arr = getWhiteIps('white_ips.conf'); $ip = '192.168.1.'; $allow = 0; foreach ($arr as $rule) {if(checkIp($ip, $rule)){$allow = 1;//找到一個排配則標(biāo)記白名單,然后結(jié)束循環(huán)break;} } echo $allow;這種有范圍的驗證,稍微復(fù)雜一點,需要逐一比對判斷。利用正則匹配IP后,結(jié)束循環(huán)。
以上內(nèi)容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業(yè)務(wù)代碼寫多了沒有方向感,不知道該從那里入手去提升,對此我整理了一些資料,包括但不限于:分布式架構(gòu)、高可擴展、高性能、高并發(fā)、服務(wù)器性能調(diào)優(yōu)、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優(yōu)化、shell腳本、Docker、微服務(wù)、Nginx等多個知識點高級進階干貨需要的可以免費分享給大家,需要
PHP進階架構(gòu)師>>>視頻、面試文檔免費獲取?shimo.im或 者關(guān)注咱們下面的知乎專欄
PHP大神進階?zhuanlan.zhihu.com總結(jié)
以上是生活随笔為你收集整理的vb.net 判断是否为ip 正则_PHP实现IP白名单的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dataframe第二列 r语言_R语言
- 下一篇: truncate table 非常慢_你