2012-10-07 27 views

Respuesta

28

Si hay un proxy delante del frasco, entonces algo como esto va a obtener la IP real en el frasco:

if request.headers.getlist("X-Forwarded-For"): 
    ip = request.headers.getlist("X-Forwarded-For")[0] 
else: 
    ip = request.remote_addr 

Actualización: Muy buen punto mencionado por Eli en su comentario. Podría haber algunos problemas de seguridad si simplemente usa esto. Lee Eli's post para obtener más detalles.

+7

Este es un consejo peligroso. Webfaction * agrega * la dirección real a X-Forwarded-For, de modo que usar este código, que selecciona la primera dirección de la lista, permite que un usuario malintencionado falsifique su dirección IP a * cualquier cadena arbitraria *. Ver http://esd.io/blog/flask-apps-heroku-real-ip-spoofing.html para una discusión más larga y mi intento de encontrar una solución. – Eli

+0

Muy buen punto Eli. Agregar la nota a la respuesta con el enlace a su publicación. –

+0

No estoy tan seguro de eso. http://docs.webfaction.com/software/django/troubleshooting.html#accessing-remote-addr (parece que usa [0], pero tu punto sigue siendo correcto, pero no para webfaction, creo) – Dexter

3

El problema es que probablemente haya algún tipo de proxy delante de Flask. En este caso, la dirección IP "real" a menudo se puede encontrar en request.headers['X-Forwarded-For'].

+0

Un buen consejo, he utilizado y que tiene solución. Publicarlo como una respuesta. –

1

Reescribiendo la respuesta del Ignas:

headers_list = request.headers.getlist("X-Forwarded-For") 
user_ip = headers_list[0] if headers_list else request.remote_addr 

Recuerde leer Eli's post consideraciones acerca de suplantación de identidad.

+0

Sí, el código es más hermoso (el mío era más amigable para novatos: D) pero todavía tiene los mismos problemas mencionados por los otros chicos, así que ten cuidado. –

2

Puede utilizar request.access_route acceder a la lista de IP:

if len(request.access_route) > 1: 
    return request.access_route[-1] 
else: 
    return request.access_route[0] 

Actualización:

simplemente puede escribir lo siguiente:

return request.access_route[-1] 
+2

No necesita realmente la verificación de longitud aquí - 'some_list [-1] == some_list [0]' en listas de longitud única –

+0

No es una lista de longitud única. puede tener más de un artículo en él. – itmard

+1

@itmard Creo que el punto de @ tristan es que el último elemento siempre está disponible para listas con> = 1 elementos. Entonces el código siempre se puede escribir como 'request.access_route [-1]' para obtener la última dirección IP de la lista. – tutuDajuju

Cuestiones relacionadas