2012-02-12 6 views
4

ここで私は、アプリケーションのコントローラで書いたコードは次のとおりです。ユーザーが特定のIPブロックから来て、リダイレクトしているかどうかを確認する最も簡単な方法は?

class ApplicationController < ActionController::Base 
    protect_from_forgery 

    before_filter :redirect_if_bolivia 

    private 

    def redirect_if_bolivia 
    if (bolivia_ip_block).includes? request.remote_ip 
     #redirect user to www.foo.com 
    end 
    end 

    def bolivia_ip_block 
    %w { 
     12.144.86.0 - 12.144.87.255 
31.201.1.176 - 31.201.1.179 
46.36.198.101 - 46.36.198.105 
46.136.172.0 - 46.136.172.255 
63.65.11.0 - 63.65.12.254 
65.173.56.0 - 65.173.63.255 
67.23.241.179 - 67.23.241.198 
72.32.164.56 - 72.32.164.63 
72.46.244.32 - 72.46.244.47 
74.91.16.48 - 74.91.16.55 
74.91.16.208 - 74.91.16.215 
74.91.20.48 - 74.91.20.71 
74.112.134.120 - 74.112.134.127 
74.112.135.104 - 74.112.135.111 
74.205.37.16 - 74.205.37.23 
78.24.205.32 - 78.24.205.47 
98.129.27.88 - 98.129.27.95 
98.129.91.40 - 98.129.91.47 
166.114.0.0 - 166.114.255.255 
167.157.0.0 - 167.157.255.255 
174.143.165.80 - 174.143.165.87 
186.0.156.0 - 186.0.159.255 
186.2.0.0 - 186.2.127.255 
186.27.0.0 - 186.27.127.255 
190.0.248.0 - 190.0.255.255 
190.3.184.0 - 190.3.191.255 
    } 
    end 
end 

だから、基本的に、request.remote_ipはボリビアIPブロックに属しているかどうかを確認する最も簡単な方法は何ですか?

ブロックごとに反復処理を行い、対応するIPを吐き出して配列に追加するのは効率的だとは思いません。実際には、それは私に1つのリクエストごとに何千ものエントリの配列を作成することにつながります。

これは新しい問題ではないと私は確信しているので、これは実証済みの解決策です。

おそらく、最初の3オクテットが一致するかどうかを調べることができます。それはブロックに属していますか? Rubyで単純な文字列比較をどうすればできますか?

答えて

9

ブロックが恣意的ではないので、サブネットをCIDR表記に変換できます。そして、あなたは「/ 30「/ 25」の中に入れたりしたときに、私が知っているだろうか、(私はもちろん、バックユニ*で失敗*)私は、IPサブネットとその慣れていないんだIPAddr#include

require 'ipaddr' 

class ApplicationController < ActionController::Base 
    protect_from_forgery 

    before_filter :redirect_if_bolivia 

    private 

    def redirect_if_bolivia 
    if bolivian_blocks.any? { |block| block.include?(request.remote_ip) } 
     #redirect user to www.foo.com 
    end 
    end 

    def bolivian_blocks 
    %w{ 
     12.144.86.0/23 
     31.201.1.176/30 
    }.map { |subnet| IPAddr.new subnet } 
    end 
end 
+0

を活用することができます"?また、 "ipaddr"はRubyのデフォルトのlibですか、フェッチする必要があるのでしょうか? –

+1

IPAddrは標準ライブラリに含まれており、すでに含まれている必要があります。提供されたリンク(後で編集)を使用して、「/ NN」を見つけることができます。それはあなたが持っている範囲を取り、使用する必要がある "/ NN"を与えます。 – AndrewF

+0

しかし、すべてのブロックを追加しましたが、 'rails -s'を実行して試してみると、私はリダイレクトされません。私は条件を削除してリダイレクトしても関係なく、リダイレクトコードはOKです。問題はMY IPとリストされたブロックの間のチェックにあります。アプリケーションをローカルでテストすると、別のIPを使用していますか? –

関連する問題