2010-11-02 7 views
12

En la fuente ActionController, solicitudes locales se definen como sigue:rieles ActionController: Diferencia entre request.remote_ip y request.remote_addr

def local_request? #:doc: 
    request.remote_addr == LOCALHOST && request.remote_ip == LOCALHOST 
end 

En mi solicitud, quiero usar la lógica diferente si las solicitudes son procedentes de una rango de IP particular. ¿Cuál es la diferencia entre request.remote_addr y request.remote_ip, y cuál debo usar?

Respuesta

13

Soy el autor de la implementación actual de remote_ip, y las otras cosas que incluye la comprobación de ataques de suplantación de identidad IP y el manejo correcto de múltiples encabezados X-Forwarded-For. Sin embargo, hay una gran advertencia: solo algunos servidores web de Ruby admiten múltiples encabezados, por lo que el valor puede ser incorrecto.

Escribí los resultados de probar los servidores de aplicaciones Ruby más populares on my blog, que es posible que desee verificar si los encabezados repetidos son importantes para su aplicación.

9

parece ser el caso de que remote_addr devuelve el valor de la variable REMOTE_ADDR entorno tal cual, mientras remote_ip ajustará esta basado en la presencia de HTTP_X_FORWARDED_FOR y HTTP_CLIENT_IP las variables, así como es posible que tenga cuando su cliente es siendo reenviado a través de un proxy.

Esa doble comprobación para local_request? es simplemente una manera de comprobar que el usuario procede de una máquina local y no se ha enviado simplemente desde otro lugar a través de un proxy local.