我的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.新的呼叫是什么?如何在网站范围内设置它?
答案 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 chain的RemoteIp工作。
通过将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
应用程序堆栈,即使false
为web-console
。此问题的解决方法是从您环境的应用程序堆栈中删除$util.urlEncode()
。
有关此问题和建议修复的详细信息,请参阅rails/rails#32379和rails/web-console#254。