Skip to content

Commit e613d41

Browse files
authored
Fix getIp for X-forwarded-for
1 parent 2a9eb98 commit e613d41

1 file changed

Lines changed: 91 additions & 7 deletions

File tree

src/Lib.php

Lines changed: 91 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,98 @@ public static function getInstance()
5252
* Vrati IP adresu.
5353
*
5454
* @return string
55+
* @see https://stackoverflow.com/a/28217316/993470
5556
*/
5657
public static function getIp()
5758
{
58-
if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && '' !== $_SERVER['HTTP_X_FORWARDED_FOR']) {
59-
return $_SERVER['HTTP_X_FORWARDED_FOR'];
59+
// Check for shared Internet/ISP IP
60+
if (!empty($_SERVER['HTTP_CLIENT_IP']) && self::validateIp($_SERVER['HTTP_CLIENT_IP'])) {
61+
return $_SERVER['HTTP_CLIENT_IP'];
6062
}
6163

62-
return @$_SERVER['REMOTE_ADDR'];
64+
// Check for IP addresses passing through proxies
65+
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
66+
67+
// Check if multiple IP addresses exist in var
68+
if (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') !== false) {
69+
$iplist = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
70+
foreach ($iplist as $ip) {
71+
if (validate_ip($ip)) {
72+
return $ip;
73+
}
74+
}
75+
} else {
76+
if (validate_ip($_SERVER['HTTP_X_FORWARDED_FOR'])) {
77+
return $_SERVER['HTTP_X_FORWARDED_FOR'];
78+
}
79+
}
80+
}
81+
if (!empty($_SERVER['HTTP_X_FORWARDED']) && self::validateIp($_SERVER['HTTP_X_FORWARDED'])) {
82+
return $_SERVER['HTTP_X_FORWARDED'];
83+
}
84+
if (!empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']) && self::validateIp($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) {
85+
return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
86+
}
87+
if (!empty($_SERVER['HTTP_FORWARDED_FOR']) && self::validateIp($_SERVER['HTTP_FORWARDED_FOR'])) {
88+
return $_SERVER['HTTP_FORWARDED_FOR'];
89+
}
90+
if (!empty($_SERVER['HTTP_FORWARDED']) && self::validateIp($_SERVER['HTTP_FORWARDED'])) {
91+
return $_SERVER['HTTP_FORWARDED'];
92+
}
93+
94+
// Return unreliable IP address since all else failed
95+
return $_SERVER['REMOTE_ADDR'];
96+
}
97+
98+
/**
99+
* Ensures an IP address is both a valid IP address and does not fall within
100+
* a private network range.
101+
*/
102+
public static function validateIp($ip)
103+
{
104+
105+
if (strtolower($ip) === 'unknown') {
106+
return false;
107+
}
108+
109+
// Generate IPv4 network address
110+
$ip = ip2long($ip);
111+
112+
// If the IP address is set and not equivalent to 255.255.255.255
113+
if ($ip !== false && $ip !== -1) {
114+
// Make sure to get unsigned long representation of IP address
115+
// due to discrepancies between 32 and 64 bit OSes and
116+
// signed numbers (ints default to signed in PHP)
117+
$ip = sprintf('%u', $ip);
118+
119+
// Do private network range checking
120+
if ($ip >= 0 && $ip <= 50331647) {
121+
return false;
122+
}
123+
if ($ip >= 167772160 && $ip <= 184549375) {
124+
return false;
125+
}
126+
if ($ip >= 2130706432 && $ip <= 2147483647) {
127+
return false;
128+
}
129+
if ($ip >= 2851995648 && $ip <= 2852061183) {
130+
return false;
131+
}
132+
if ($ip >= 2886729728 && $ip <= 2887778303) {
133+
return false;
134+
}
135+
if ($ip >= 3221225984 && $ip <= 3221226239) {
136+
return false;
137+
}
138+
if ($ip >= 3232235520 && $ip <= 3232301055) {
139+
return false;
140+
}
141+
if ($ip >= 4294967040) {
142+
return false;
143+
}
144+
}
145+
146+
return true;
63147
}
64148

65149
/**
@@ -1237,8 +1321,8 @@ public static function parseStringForSearch($string)
12371321
}
12381322

12391323
return $conditions;
1240-
}
1241-
1324+
}
1325+
12421326
/**
12431327
* @param string $input
12441328
* @param int $rowLength
@@ -1249,7 +1333,7 @@ public static function wrapPlainText($input, $rowLength = 50)
12491333
$words = explode(' ', $input);
12501334
$rows = [];
12511335
$row = '';
1252-
1336+
12531337
foreach ($words as $word) {
12541338
if (strlen($row . ' ' . $word) > $rowLength) {
12551339
$rows[] = trim($row);
@@ -1258,7 +1342,7 @@ public static function wrapPlainText($input, $rowLength = 50)
12581342
$row .= ' ' . $word;
12591343
}
12601344
$rows[] = trim($row);
1261-
1345+
12621346
return implode("\n", $rows);
12631347
}
12641348

0 commit comments

Comments
 (0)