2014-02-24 70 views
1
一個Rails應用程序2.3.15塊中的不良代理

我正在尋找一種方法來阻止特定的代理,比如這一個:訪問在Heroku

http://demosites.conversionsupport.com/reverseproxydemo?domainpath=http://stackoverflow.com

我不希望它在Heroku上訪問/顯示我的rails 2.3.15應用程序。我已經玩過機架重寫和機架塊,但沒有運氣去那條路線,因爲我需要阻止域名,而不是IP地址(該東西託管在ghs.google.com,我想而不是塊)

在一個完美的世界,我可以重定向到我的規範的網址,但我也想解決一個503或404

(有問題的反向代理是用來炫耀的代理業主的聊天工具應用程序,但在任何網站上,而不是限制使用由代理業主的潛在客戶擁有的網站,這也導致谷歌的網站管理員工具來記錄一些討厭的爬行機器人的錯誤,這本身並沒有一個大問題,但是當加上那個破壞網站功能的東西,以及我的網站有一個知識共享許可證這個事實STS網站不得用於商業目的被重用,這讓我想制止它。)

回答

0

由於沒有我們上面提到的寶石可與軌道2.3.15(我已經因爲更新到2.3.18)使用,而我沒有時間做從梁2艱鉅升級軌3,我結束了以下解決方案。 (注意:此解決方案僅適用於從/ app提供的頁面,它不適用於從/ public提供的頁面,我仍在尋找一種解決方案來保護/ public的頁面。)

我丟棄了下面的代碼到/app/controllers/application_controller.rb

1.2.3.*是我實際阻止的IP地址塊的佔位符。與要阻止,或者用一個單一的IP地址替換1.2.3.*阻止單個IP的0/24範圍的前三個八位字節替換1.2.3。您還需要與您要發送的用戶,使他們能夠在它被認爲在所顯示的URL查看,而不是在反向代理的離開他們你的頁面,你的503頁面的地址,或其它頁面替換http://YourCanonicalDomain.tld/503.html網址:

before_filter: block_ip 

然後在後面的文件:

def block_ip 
     if request.remote_ip.match('1.2.3.*') 
    redirect_to "http://YourCanonicalDomain.tld/503.html" 
    return 
    end 
end 

我503.html,它駐留在/公共,顯示了一張字條給用戶他們試圖在某種程度上來查看內容這是不允許的,他們很快會被重定向到該網站的主頁。該503.html包含此內:

<meta http-equiv="REFRESH" content="15;url=http://YourCanonicalDomain.tld"> 

替換http://YourCanonicalDomain.tld你想將用戶重定向到該頁面。提高或降低號碼15以在用戶重定向之前提高或降低頁面顯示的時間量。

0

Rack::Attack!!!似乎相當透徹。我有support for blacklisting,這聽起來像你所需要的。它沒有提到Rails 2.3的支持,但你可以直接使用你的config.ru進行配置。

自述給出的例子,顯示了這個

Rack::Attack.blacklist('block bad UA logins') do |req| 
    req.path == '/login' && req.post? && req.user_agent == 'BadUA' 
end 

它看起來像Rack requestreq)對象傳遞到塊,所以你應該能夠使用任何方法可用的對象。

+0

感謝您的建議,但從我所看到的看起來像機架重寫和機架塊,我可以使用機架攻擊阻止通過該不良代理查看我的網站的特定客戶端,但它似乎沒有辦法檢查瀏覽器地址欄中顯示的完整URL,並根據代理的URL使用而不是我的方式重寫或重定向或阻止。或者我可能錯過了一些明顯的東西,正在凝視着我的臉? – ohsurewhynot

+0

我已經更新了我的答案。我不確定您是否可以在Rack請求對象上使用#referrer? – jordelver

+0

感謝您的新建議,但這是針對公共場所的。唯一的登錄是管理員。不知何故,糟糕的代理完全不在日誌中留下引用條目。 但是,我有一個想法,試試這個: http://demosites.conversionsupport.com/reverseproxydemo?domainpath=http://showmemyip.com 並發現它報告該代理的IP地址,而是比我以前錯誤地認爲的用戶的IP地址。畢竟我可能會使用機架式攻擊(如果我可以弄清楚如何讓他們在/ public中的文件以及從/ app提供的頁面上工作)。 – ohsurewhynot