77use function filter_var ;
88use function getenv ;
99
10+ use const FILTER_FLAG_IPV4 ;
1011use const FILTER_FLAG_IPV6 ;
1112use const FILTER_FLAG_NO_PRIV_RANGE ;
13+ use const FILTER_FLAG_NO_RES_RANGE ;
1214use const FILTER_VALIDATE_IP ;
1315
1416class IpService
@@ -17,20 +19,20 @@ public static function getUserIp(array $server): mixed
1719 {
1820 if (! empty ($ server )) {
1921 // check if HTTP_X_FORWARDED_FOR is public network IP
20- if (isset ($ server ['HTTP_X_FORWARDED_FOR ' ]) && self ::validIp ($ server ['HTTP_X_FORWARDED_FOR ' ]) === ' public ' ) {
22+ if (isset ($ server ['HTTP_X_FORWARDED_FOR ' ]) && self ::isPublicIp ($ server ['HTTP_X_FORWARDED_FOR ' ])) {
2123 $ realIp = $ server ['HTTP_X_FORWARDED_FOR ' ];
2224 // check if HTTP_CLIENT_IP is public network IP
23- } elseif (isset ($ server ['HTTP_CLIENT_IP ' ]) && self ::validIp ($ server ['HTTP_CLIENT_IP ' ]) === ' public ' ) {
25+ } elseif (isset ($ server ['HTTP_CLIENT_IP ' ]) && self ::isPublicIp ($ server ['HTTP_CLIENT_IP ' ])) {
2426 $ realIp = $ server ['HTTP_CLIENT_IP ' ];
2527 } else {
2628 $ realIp = $ server ['REMOTE_ADDR ' ];
2729 }
2830 } else {
2931 // check if HTTP_X_FORWARDED_FOR is public network IP
30- if (getenv ('HTTP_X_FORWARDED_FOR ' ) && self ::validIp (getenv ('HTTP_X_FORWARDED_FOR ' )) === ' public ' ) {
32+ if (getenv ('HTTP_X_FORWARDED_FOR ' ) && self ::isPublicIp (getenv ('HTTP_X_FORWARDED_FOR ' ))) {
3133 $ realIp = getenv ('HTTP_X_FORWARDED_FOR ' );
3234 // check if HTTP_CLIENT_IP is public network IP
33- } elseif (getenv ('HTTP_CLIENT_IP ' ) && self ::validIp (getenv ('HTTP_CLIENT_IP ' )) === ' public ' ) {
35+ } elseif (getenv ('HTTP_CLIENT_IP ' ) && self ::isPublicIp (getenv ('HTTP_CLIENT_IP ' ))) {
3436 $ realIp = getenv ('HTTP_CLIENT_IP ' );
3537 } else {
3638 $ realIp = getenv ('REMOTE_ADDR ' );
@@ -40,27 +42,15 @@ public static function getUserIp(array $server): mixed
4042 return $ realIp ;
4143 }
4244
43- /**
44- * @return false|string
45- */
46- public static function validIp (string $ ip ): bool |string
45+ public static function isPublicIp (string $ ipAddress ): bool
4746 {
48- // special cases that return private are the loop-back address and IPv6 addresses
49- if ($ ip === '127.0.0.1 ' || filter_var ($ ip , FILTER_VALIDATE_IP , FILTER_FLAG_IPV6 )) {
50- return 'private ' ;
51- }
52-
53- // check if the ip is valid
54- if (filter_var ($ ip , FILTER_VALIDATE_IP )) {
55- // check whether it's private or not
56- if (filter_var ($ ip , FILTER_VALIDATE_IP , FILTER_FLAG_NO_PRIV_RANGE )) {
57- return 'public ' ;
58- }
59-
60- return 'private ' ;
61- }
62-
63- // not a valid ip
64- return false ;
47+ return filter_var (
48+ $ ipAddress ,
49+ FILTER_VALIDATE_IP ,
50+ FILTER_FLAG_IPV4 |
51+ FILTER_FLAG_IPV6 |
52+ FILTER_FLAG_NO_PRIV_RANGE |
53+ FILTER_FLAG_NO_RES_RANGE
54+ ) === $ ipAddress ;
6555 }
6656}
0 commit comments