2012-01-10 12 views
0

私はラックの専門家ではないので、私はRack 1.4 source codeに登場一つのことを理解していない:ラックおよび信頼されたIP

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?はアドレスが属しているかどうかを返すように見えますローカルネットワーク(または自分自身のコンピュータ)に送信します。

forwarded_ipstrusted_ipsを拒否していますか?私はネットワーク内にいるときに外部から要求を行っているIPを偽造しているようですので、

答えて

1

trusted_proxy?は、信頼できる場合はtrueを返します。ローカルアドレスの場合は10.xxxまたは172.xxx、ループバックアドレス(127.0.0.1)、またはlocalhost

以下、remote_addrs.reject!はコレクションを取り、ブロック内のtrueというものをそのコレクションから削除します。 IPアドレスの集合(ローカルとリモートが混在している)を想像してみてください。そのブロックはIPアドレスのリストを受け取り、は拒否しますtrusted_proxy?メソッドでtrueを返します。アドレス。

別の言い方をすると、IPアドレスのリストを取得し、ローカルIPアドレスを拒否して、リモートIPだけを残します。

forwarded_ipsは、ヘッダ、HTTP_X_FORWARDED_FORにおける情報に基づいて撮像された等

最後に、forwarded_ipsのリストが他client_ip、及びfalseを含む場合if client_ip戻りtrue始まるブロック。

全体的に私はこの最後の部分を少しは推測していますが、ipメソッドの目的は、接続のIPアドレスを最終的に返すことだと思います。そうでなければなりすましの試みであるとは思われない。私が言ったように、私はそれについて確かにはわかりませんが、ipメソッドは、そのメソッドの目的の範囲内で有用なものを返すために、一連の入力フィルタとして機能するようです。

関連する問題