2014-02-24 42 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