可以支持段号和星号,支持白名单,黑名单
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,如需转载请自行联系原作者