2012-01-10 10 views
0

Je ne suis pas un expert en rack, donc je ne comprenais pas une chose qui est apparu sur Rack 1.4 source code:IP rack et de confiance

def trusted_proxy?(ip) 
    ip =~ /^127\.0\.0\.1$|^(10|172\.(1[6-9]|2[0-9]|30|31)|192\.168)\.|^::1$|^fd[0-9a-f]{2}:.+|^localhost$/i 
end 

def ip 
    remote_addrs = @env['REMOTE_ADDR'] ? @env['REMOTE_ADDR'].split(/[,\s]+/) : [] 
    remote_addrs.reject! { |addr| trusted_proxy?(addr) } 

    return remote_addrs.first if remote_addrs.any? 

    forwarded_ips = @env['HTTP_X_FORWARDED_FOR'] ? @env['HTTP_X_FORWARDED_FOR'].strip.split(/[,\s]+/) : [] 

    if client_ip = @env['HTTP_CLIENT_IP'] 
    # If forwarded_ips doesn't include the client_ip, it might be an 
    # ip spoofing attempt, so we ignore HTTP_CLIENT_IP 
    return client_ip if forwarded_ips.include?(client_ip) 
    end 

    return forwarded_ips.reject { |ip| trusted_proxy?(ip) }.last || @env["REMOTE_ADDR"] 
end 

`` `

trusted_proxy? semble revenir si l'adresse appartient à un réseau local (ou même mon propre ordinateur).

Est-ce qu'il rejette trusted_ips avec forwarded_ips parce qu'il semble que je forge une adresse IP faisant une demande de l'extérieur quand je suis dans un réseau?

Répondre

1

Les trusted_proxy? renvoie true si elle est digne de confiance, et oui, il semble qu'il retourne vrai que si elle est une adresse locale - quelque chose avec 10.xxx ou 172.xxx, l'adresse loopback (127.0.0.1), ou localhost,

En dessous, il a remote_addrs.reject! qui prend une collection, et supprime de cette collection tout ce qui est true dans le bloc. Imaginez que vous ayez une collection d'adresses IP (un mélange de local et distant) - ce que fait ce bloc est de prendre cette liste d'adresses IP et rejette tout ce qui retourne vrai à travers la méthode trusted_proxy?, donc tout ce qui vous reste est la télécommande adresses.

Pour le dire autrement, il prend une liste d'adresses IP et rejette les adresses locales, vous laissant avec seulement des adresses IP distantes.

Le forwarded_ips sont pris en charge sur la base des informations dans l'en-tête, HTTP_X_FORWARDED_FOR, etc.

Enfin, le bloc qui commence par if client_ip retours true si la liste des forwarded_ips comprend le client_ip et false autrement. Dans l'ensemble, et je devine un peu sur cette dernière partie, mais je pense que le but de la méthode ip est de retourner finalement l'adresse IP de la connexion, ou quelque chose, si et seulement si c'est une adresse IP de confiance ne semble pas être une tentative d'usurpation d'identité. Comme je l'ai dit, je ne suis pas vraiment sûr à ce sujet, mais la méthode ip semble agir comme une série de filtres sur l'entrée pour vous rendre quelque chose d'utile dans le cadre de l'objectif de cette méthode.