2012-07-24 49 views
2

我一直在努力研究阻止訪問我們的Rails 3應用程序的正確方法,除了少量的IP地址和幾個IP子網。在Rails 3應用程序中將某些子網的IP列入白名單

在尋找方法時,我發現這個question/answer。建議的代碼如下:

應用控制器

before_filter :protect 

def protect 
    @ips = ['127.0.0.1', '203.123.10.1'] #And so on ...] 
    if not @ips.include? request.remote_ip 
    # Check for your subnet stuff here, for example 
    # if not request.remote_ip.include?('127.0,0') 
    render :text => "You are unauthorized" 
    return 
    end 
end 

這個工作,所以我改變它重定向到一個靜態頁面,而不僅僅是文字信息。

但是我想要做的是允許從Rails應用服務器的同一個子網上的本地IP訪問。該子網只是192.168.1.0/24

什麼是最容易/最乾淨的方式將子網添加到接受的IP?

回答

4

要測試一個給定的IP地址foo是地址net指定的網絡中並掩蓋mask,你會敷面膜對於網絡地址和測試地址,看看結果是相等的:foo & mask == net & mask。您必須先將IP地址和掩碼轉換爲整數。 /24的掩碼是24位,設置爲1,後面的8位設置爲0-0xFFFFFF00255.255.255.0,採用點分四進製表示法。

before_filter :protect 

def protect 
    @ips = ['127.0.0.1', '192.168.1.0/24'] #And so on ...] 
    allowed = false 
    # Convert remote IP to an integer. 
    bremote_ip = request.remote_ip.split('.').map(&:to_i).pack('C*').unpack('N').first 
    @ips.each do |ipstring| 
    ip, mask = ipstring.split '/' 
    # Convert tested IP to an integer. 
    bip = ip.split('.').map(&:to_i).pack('C*').unpack('N').first 
    # Convert mask to an integer, and assume /32 if not specified. 
    mask = mask ? mask.to_i : 32 
    bmask = ((1 << mask) - 1) << (32 - mask) 
    if bip & bmask == bremote_ip & bmask 
     allowed = true 
     break 
    end 
    end 

    if not allowed 
    render :text => "You are unauthorized" 
    return 
    end 
end 
+0

謝謝,但我得到了以下錯誤:'錯誤消息:NoMethodError:未定義的方法&的; 192.168.1.17;:String' – dannymcc 2012-07-24 20:03:26

+0

這是行絕對正確的嗎? '如果bip&bmask == request.remote_ip&bmask' – dannymcc 2012-07-24 20:04:54

+0

對不起,我沒有將'request.remote_ip'從字符串轉換爲整數。我更新了代碼以進行轉換。 – 2012-07-24 21:24:24

相關問題