2010-11-23 39 views
1

我想關閉在我們的網站上運行屏幕刮取器並挖掘數據的人員。或者至少讓他們放慢時間。如何防止Rails中的某個IP訪問?

我的想法是每個IP地址寫入到內存中的對象和計數,他們每分鐘多少個請求製作,然後把它們放在一些「無法訪問」列表中,如果它們超過了一些數字,我設置。

我只是在尋找這是否是一個Rails應用程序完善辦法的一些社區確認。謝謝你盡你所能的幫助。

回答

0

我不知道你們,我想出了一個相當不錯的方式,在應用程序做到這一點。無論如何,我只想在一個應用程序中懲罰不良行爲。我落得這樣做是:

def log_ip 
    # Initialize 
    if IPLOG.include?(request.ip) 
    IPLOG[request.ip][:count]+=1 
    else 
    IPLOG[request.ip] = {:time => Time.now, :count => 1} 
    end 
    # Reset the time if necessary 
    IPLOG[request.ip][:time] = Time.now if IPLOG[request.ip][:time] < 1.minute.ago 
    if IPLOG[request.ip][:count] > REQUESTS_PER_MINUTE_UNTIL_BLACKLIST 
    Blacklist.create(:ip_address => request.ip, :count => IPLOG[request.ip][:count]) 
    end 
    if Blacklist.where(:ip_address => request.ip).first 
    IPLOG.delete(request.ip) 
    redirect_to blocked_path 
    end 
end 

我敢肯定,我可以收緊這件事,所以我沒有做DB命中每一次,但它似乎是相當不錯的了。它昨晚抓住了GoogleBot。另外,如果一羣人通過一個已知的代理進入,那麼就有機會將IP地址列入白名單。

3

我不知道這是爲了保護您的網站從這些IP在應用層是一個好主意。我會親自調查是否可以在網絡級別執行此操作,例如在防火牆/路由器中。如果您有Cisco路由器,請查看「速率限制」命令。

+0

1使用任意一種網絡配置或至少web服務器配置(nginx的/阿帕奇),而不是用於阻止用戶關閉應用的變化。我認爲web服務器配置只會允許一個完整的塊,所以去網絡設置。 – Jeremy 2010-11-25 22:13:59