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,將它添加到數組是有效的。事實上,這將導致我爲每個請求創建數千個條目的數組。
我敢肯定,這不是一個新問題,所以我很樂意有一個經過驗證的解決方案。
也許我可以檢查前三個八位字節是否匹配,然後它屬於該塊?我如何在Ruby中做簡單的字符串比較?
我不是那熟悉的IP子網(*我失敗了該課程早在統一*),我怎麼會知道什麼時候放「/ 25」或「/ 30 「?。此外,是「ipaddr」在Ruby中的默認庫或我必須獲取的寶石? – 2012-02-12 02:16:04
IPAddr位於標準庫中,應已包含。您可以使用提供的鏈接(我之後編輯)找到「/ NN」。它需要你有的範圍,並給你你應該使用的「/ NN」。 – AndrewF 2012-02-12 02:19:29
好吧,我已經在所有塊中添加了,但是當我運行'rails -s'並試用時,我根本沒有重定向。我已經刪除了條件和重定向無論如何,它的工作,所以重定向代碼是好的,問題在於我的IP和我列出的塊之間的檢查。如果我在本地測試我的應用程序,我是否使用不同的IP? – 2012-02-12 02:29:08