如何在Rails 4应用程序中禁用IP Spoofing检查?

时间:2015-01-14 01:15:10

标签: ruby-on-rails spoofing

我的Rails 4应用程序出现以下错误:

  

ActionDispatch :: RemoteIp :: IpSpoofAttackError:IP欺骗攻击?! HTTP_CLIENT_IP =“xx.xx.xx.xx”HTTP_X_FORWARDED_FOR =“xx.xx.xx.xx”

我们不需要这种类型的安全检查,所以经过一些谷歌搜索我发现了这个:

https://github.com/rails/rails/issues/10780

  

当中间代理插入用户IP地址时   HTTP_CLIENT_IP和HTTP_X_FORWARDED_FOR,这个地址是   private,ActionDispatch :: RemoteIp引发IpSpoofAttackError   异常。

     

当企业代理在标头中包含用户的IP地址时,   这通常是私人的。从中删除私有IP地址   HTTP_X_FORWARDED_FOR中包含的链可能只应该完成   当地址与找到的地址不完全匹配时   HTTP_CLIENT_IP。如果匹配,那应该是用户的IP   地址。

     

例如,在以下环境中会发生这种情况:

     

HTTP_CLIENT_IP:172.17.19.51 HTTP_X_BLUECOAT_VIA:ffffffffffffffff   HTTP_X_FORWARDED_FOR:172.17.19.51 REMOTE_ADDR:xxx.xxx.xxx.xxx(这个   将是一个公共IP地址)


此处提供的修补程序:

  

作为解决方法,我在config / application.rb中禁用了此检查:

     

config.action_dispatch.ip_spoofing_check = false

然而,这似乎不适用于Rails 4.新的呼叫是什么?如何在网站范围内设置它?

3 个答案:

答案 0 :(得分:5)

不是关闭警告,而是修复实际问题可能更好。这是我对Rails告诉你的内容的改述:

  

这个请求似乎来自两个不同的反向代理。其中一个将CLIENT_IP标头设置为用户的IP地址;另一个设置了X_FORWARDED_FOR标题。其中一个值可能是正确的,另一个可能包含反向代理的IP,我无法分辨哪个是哪个。我无法可靠地确定该用户的IP地址,因此我将拒绝该请求。

"正确"解决方案是停止设置两个标头。为此,您需要追踪他们来自哪里(我从您的Bluecoat设备开始),并找出他们是否都需要。通常你只会使用其中一个。

如果事实证明它们都是必需的(我已经看到了陌生的东西),那么你需要先找出首先设置的标题(假设链中有两个代理)。然后,您可以编写一个删除其他HTTP标头的自定义中间件。

有关如何创建自己的中间件的指示,请参阅Rails 3 middleware modify request headers。在RemoteIp中间件之前插入它,清除哪个标题有"坏"价值,你应该是好的。

答案 1 :(得分:3)

config.action_dispatch.ip_spoofing_check 根据calling chainRemoteIp工作。

通过将config.action_dispatch.trusted_proxies设置为regex matching all IPv4 addresses,您应该能够达到同样的效果。

答案 2 :(得分:0)

config.action_dispatch.ip_spoofing_check = false仍然是正确的设置。

但是,web-console(默认情况下包含在Rails development环境中,因为Rails 4.2)并不尊重此设置,只要它包含在IpSpoofAttackError中,就会引发spoofing_check应用程序堆栈,即使falseweb-console。此问题的解决方法是从您环境的应用程序堆栈中删除$util.urlEncode()

有关此问题和建议修复的详细信息,请参阅rails/rails#32379rails/web-console#254