PHP版本的IP段驗證類
可以支援段號和星號,支援白名單,黑名單
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
class IpHelper
{ /**
* IP驗證
*
* 如果地址在黑名單中,返回false;
* 如果地址不在黑名單但在白名單中,返回true;
* 如果地址既不在黑名單也不在白名單,視是否是嚴格模式而定,
* 如果是嚴格模式,則當IP不在黑白名單時返回false;反之,返回true
*
* @param string $ip 訪問IP
* @param array $valid_list 白名單
* @param array $invalid_list 黑名單
* @param boolean $is_strict 是否嚴格模式
* @return boolean
*/
public static function checkIP( $ip , $valid_list , $invalid_list = array (), $is_strict =true)
{
$ip_segs = explode ( `.` , $ip );
// 先黑後白
if (! empty ( $invalid_list ))
{
return self::isInSection( $ip_segs , $invalid_list ) ? false : true;
}
if (! empty ( $valid_list ))
{
return self::isInSection( $ip_segs , $valid_list );
}
return $is_strict == true ? false : true;
}
/**
* 判斷某個IP是否在某個網段內
*
* @param array $ip_segs IP分段陣列
* @param array $section_list 指定IP或IP段列表
* @return boolean
*/
public static function isInSection( $ip_segs , $ip_list )
{
foreach ( $ip_list as $key => $val )
{
$ip_str = self::formatIp( $val );
if (! empty ( $ip_str ))
{
$segments = explode ( `.` , $ip_str );
if (self::isValidSegment( $ip_segs , $segments ))
{
return true;
}
}
}
return false;
}
/**
* 格式化IP
*
* @param string $ip IP段或IP地址
* @return mixed
*/
public static function formatIp( $ip )
{
$arr = explode ( `.` , $ip );
$repeat_count = 4 - count ( $arr );
if ( $repeat_count < 0)
{
return false;
}
$ip .= str_repeat ( `.*` , $repeat_count ); // 追加成完整格式
return str_replace ( `*` , `0-255` , $ip ); // 把星號轉換成標準段
}
/**
* 驗證IP是否在合法範圍中
*
* 依次比較每個IP進行判斷,如果全都符合,返回true,有任何不符,返回false
*
* @param array $ip_segs IP分段陣列
* @param array $segments 指定IP或IP段分段陣列
* @return boolean
*/
public static function isValidSegment( $ip_segs , $segments )
{
foreach ( $segments as $key => $val )
{
if ( strstr ( $val , `-` ) !== false)
{
$range = explode ( `-` , $val );
if ( $ip_segs [ $key ] < (int) $range [0] || $ip_segs [ $key ] > (int) $range [1])
{
return false;
}
}
else
{
if ((string) $ip_segs [ $key ] != trim( $val ))
{
return false;
}
}
}
return true;
}
} |
測試:
1
2
3
4
5
6
7
8
9
10
|
$ip1 = "10.237.1.100" ;
$ip2 = "10.237.3.100" ;
$valid_list = array ( "10.237.1-2.*" );
$invalid_list = array ( "10.237.1.100" );
$rs1 = IpHelper::checkIP( $ip1 , $valid_list );
$rs2 = IpHelper::checkIP( $ip2 , $valid_list );
$rs3 = IpHelper::checkIP( $ip1 , $valid_list , $invalid_list );
var_dump( $rs1 );
var_dump( $rs2 );
var_dump( $rs3 );
|
輸出結果:
1
2
3
|
boolean true boolean false boolean false |
本文轉自 ustb80 51CTO部落格,原文連結:http://blog.51cto.com/ustb80/1300037,如需轉載請自行聯絡原作者
相關文章
- Go IP 段範圍校驗Go
- PHP驗證碼PHP
- 驗證代理IP的三種方法
- PHP 驗證身份證號碼PHP
- 身份證驗證工具類
- Elasticsearch-PHP 公用類 Laravel 版本ElasticsearchPHPLaravel
- 驗證手機、郵箱、漢字、身份證、URL、IP地址等java程式碼工具類Java
- PHP行為驗證碼PHP
- php 驗證格式的函式總結PHP函式
- 聊聊如何驗證線上的版本是符合預期的版本
- 自用驗證類封裝封裝
- 伺服器ip的A段B段C段的區別伺服器
- 驗證物件是否為空的工具類物件
- lumen驗證類 實現控制器場景驗證
- Laravel 驗證類 實現 路由場景驗證 和 控制器場景驗證Laravel路由
- 表單驗證工具類ValidationUtils
- ThinkPHP 類似 AOP 思想的引數驗證PHP
- yandexbot ip 地址段
- 導致代理IP驗證不準確的四種原因
- PHP簡訊驗證碼防刷方案PHP
- PHP 攻擊簡訊驗證碼介面PHP
- 6. 自定義容器型別元素驗證,類級別驗證(多欄位聯合驗證)型別
- ThinkPHP5.0.*版本 cli模式下php每隔段時間就出錯PHP模式
- 檢視Google Cloud的IP地址段GoCloud
- 自定義一個簡單的資料模型驗證器類,可用於各類驗證場景,待後續完善模型
- php onethink驗證碼不顯示的解決辦法PHP
- PHP實現隨機數字、字母的驗證碼功能PHP隨機
- 自定義類載入器驗證類載入機制
- 5種PHP生成圖片驗證碼例項PHP
- PHP 表單提交後臺資料驗證 ValidatorPHP
- 驗證裡,PHP 檔案中指定自定義值PHP
- PHP 對資料進行驗證和過濾PHP
- PHP校驗15位和18位身份證號PHP
- Windows bat ping一個網段的ipWindowsBAT
- WebGeeker-Validation: 一個強大的 PHP 引數驗證器WebPHP
- PHP歷理 PhpStorm的設定PHP版本PHPORM
- 在 Yii2 中使用 Laravel 驗證類Laravel
- Ubuntu 多個 PHP 版本 修改某個版本的 php.ini 重啟 PHP-fpmUbuntuPHP
- 【驗證碼逆向專欄】xx80 郵箱多種類驗證碼逆向分析