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

ser*_*erg 8 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

当中间代理在HTTP_CLIENT_IP和HTTP_X_FORWARDED_FOR中插入用户IP地址,并且此地址是私有的时,ActionDispatch :: RemoteIp会引发IpSpoofAttackError异常.

当企业代理在标头中包含用户的IP地址时,这通常是私有的.只有当地址与HTTP_CLIENT_IP中找到的地址不完全匹配时,才应该从HTTP_X_FORWARDED_FOR中包含的链中删除私有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.什么是新的调用,如何在网站范围内设置它?

Jam*_*son 7

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

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

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

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

有关如何创建自己的中间件的指示,请参阅Rails 3中间件修改请求标头.在RemoteIp中间件之前插入它,清除哪个标题有"坏"值,你应该是好的.


fyl*_*ooi 5

config.action_dispatch.ip_spoofing_check 应该基于RemoteIp调用链工作。

通过设置匹配所有 IPv4 地址的正则表达式config.action_dispatch.trusted_proxies,您应该能够达到相同的效果。