2011-11-06 13 views
6

Richieste di proxy Heroku da un client a un server, quindi è necessario analizzare X-Forwarded-For per trovare l'indirizzo IP di origine.Parse X-Forwarded-Per ottenere ip con werkzeug su Heroku

Il formato generale della X-Forwarded-For è:

X-Forwarded-For: client1, proxy1, proxy2 

Utilizzando werkzeug il pallone, sto cercando di trovare una soluzione al fine di accedere al originario IP del client.

Qualcuno sa un buon modo per farlo?

Grazie!

risposta

15

Werkzeug (e Flask) archiviano le intestazioni in un'istanza di werkzeug.datastructures.Headers. Si dovrebbe essere in grado di fare qualcosa del genere:

provided_ips = request.headers.getlist("X-Forwarded-For") 
# The first entry in the list should be the client's IP. 

In alternativa, è possibile utilizzare request.access_route (grazie @Bastian per la segnalazione!):

provided_ips = request.access_route 
# First entry in the list is the client's IP 
+1

si potrebbe voler controllare http://werkzeug.pocoo.org/docs/wrappers/#werkzeug. wrappers.BaseRequest.access_route – Bastian

+0

@Bastian il link che hai postato dice "se l'intestazione inoltrata esiste" che capisco sarebbe "X-Forwarded-For", quindi nel caso in cui l'header inoltrato non esiste la funzione access_route funzionerà, non lo faccio avere un posto dove testare la mia app di flask diversa da heroku. –

2

Questo è quello che uso in Django. Vedi questo https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_host

Nota: Almeno su Heroku HTTP_X_FORWARDED_FOR sarà una matrice di indirizzi IP. Il primo è l'IP del client, il resto sono gli IP del server proxy.

in settings.py:

USE_X_FORWARDED_HOST = True 

nel views.py:

if 'HTTP_X_FORWARDED_FOR' in request.META: 
    ip_adds = request.META['HTTP_X_FORWARDED_FOR'].split(",") 
    ip = ip_adds[0] 
else: 
    ip = request.META['REMOTE_ADDR'] 
+0

Si prega di leggere [questa nota sull'ultimo IP in 'X-Forwarded-For' è l'unica affidabile su Heroku] (http://stackoverflow.com/a/18517550/429091) (a meno che non si fidino dei client al di fuori di Heroku non mentire su se stessi ... – binki