2010-11-02 32 views
12

Dans la source ActionController, les demandes locales sont définies comme suit:Rails ActionController: Différence entre request.remote_ip et request.remote_addr

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

Dans ma demande, je veux utiliser une logique différente si les demandes proviennent d'une plage IP particulière. Quelle est la différence entre request.remote_addr et request.remote_ip, et lequel devrais-je utiliser?

Répondre

13

Je suis l'auteur de la mise en œuvre actuelle de remote_ip, et les autres choses qu'il comprend la vérification des attaques d'usurpation IP, et la gestion correcte de plusieurs en-têtes X-Forwarded-For. Il y a cependant une grosse mise en garde: seuls certains serveurs web Ruby supportent plusieurs en-têtes, donc la valeur peut encore être erronée.

J'ai rédigé les résultats en testant les serveurs d'applications Ruby les plus populaires on my blog, que vous pouvez vérifier si des en-têtes répétés sont importants pour votre application.

9

Il semble être le cas que remote_addr retourne la valeur du tout remote_ip ajustera cette fonction de la présence de HTTP_X_FORWARDED_FOR et HTTP_CLIENT_IP comme variables-est variable d'environnement REMOTE_ADDR, ainsi, comme vous pourriez avoir lorsque votre client est être transmis à travers un proxy.

Cette double vérification pour local_request? est simplement un moyen de vérifier que l'utilisateur provenait d'une machine locale et n'était pas simplement transféré d'un autre endroit via un proxy local.