1+ from securenative .utils .ip_utils import IpUtils
2+
3+
14class RequestUtils (object ):
25 SECURENATIVE_COOKIE = "_sn"
36 SECURENATIVE_HEADER = "x-securenative"
7+ IP_HEADERS = ["HTTP_X_FORWARDED_FOR" , "X_FORWARDED_FOR" , "REMOTE_ADDR" , "x-forwarded-for" , "x-client-ip" , "x-real-ip" , "x-forwarded" , "x-cluster-client-ip" , "forwarded-for" , "forwarded" , "via" ]
48
59 @staticmethod
610 def get_secure_header_from_request (headers ):
@@ -15,33 +19,60 @@ def get_client_ip_from_request(request, options):
1519 for header in options .proxy_headers :
1620 try :
1721 if request .environ .get (header ) is not None :
18- return request .environ .get (header )
22+ ips = request .environ .get (header ).split (',' )
23+ return RequestUtils .get_valid_ip (ips )
1924 if request .headers [header ] is not None :
20- return request .headers [header ]
25+ ips = request .headers [header ].split (',' )
26+ return RequestUtils .get_valid_ip (ips )
2127 except Exception :
2228 try :
2329 if request .headers [header ] is not None :
24- return request .headers [header ]
30+ ips = request .headers [header ].split (',' )
31+ return RequestUtils .get_valid_ip (ips )
2532 except Exception :
2633 continue
2734
28- try :
29- x_forwarded_for = request . META . get ( 'HTTP_X_FORWARDED_FOR' )
30- if x_forwarded_for :
31- ip = x_forwarded_for . split ( ',' )[ - 1 ]. strip ( )
32- else :
33- ip = request . META . get ( 'REMOTE_ADDR' )
35+ for header in RequestUtils . IP_HEADERS :
36+ try :
37+ ips = request . headers . get ( header ). split ( ',' )
38+ return RequestUtils . get_valid_ip ( ips )
39+ except Exception :
40+ continue
3441
35- if ip is None or ip == "" :
36- ip = request .environ .get ('HTTP_X_FORWARDED_FOR' , request .environ .get ('REMOTE_ADDR' , "" ))
42+ for header in RequestUtils .IP_HEADERS :
43+ try :
44+ ips = request .META .get (header ).split (',' )
45+ return RequestUtils .get_valid_ip (ips )
46+ except Exception :
47+ continue
3748
38- return ip
39- except Exception :
40- return ""
49+ return ""
4150
4251 @staticmethod
4352 def get_remote_ip_from_request (request ):
4453 try :
45- return request .raw ._original_response .fp .raw ._sock .getpeername ()[0 ]
54+ if len (request .raw ._original_response .fp .raw ._sock .getpeername ()) > 0 :
55+ return request .raw ._original_response .fp .raw ._sock .getpeername ()[0 ]
4656 except Exception :
4757 return ""
58+
59+ @staticmethod
60+ def get_valid_ip (ips ):
61+ if isinstance (ips , list ):
62+ for ip in ips :
63+ ip = ip .strip ()
64+ if IpUtils .is_valid_public_ip (ip ):
65+ return ip
66+
67+ # No public ip found check for no loopback
68+ for ip in ips :
69+ ip = ip .strip ()
70+ if not IpUtils .is_loop_back (ip ):
71+ return ip
72+
73+ ip = ips .strip ()
74+ if IpUtils .is_valid_public_ip (ip ):
75+ return ip
76+
77+ if IpUtils .is_loop_back (ip ):
78+ return ip
0 commit comments