@@ -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