2015-01-14 21 views
6

Ich erhalte den folgenden Fehler auf meiner Rails 4 Anwendung:Wie kann ich die IP-Spoofing-Prüfung in der Rails 4-Anwendung deaktivieren?

ActionDispatch::RemoteIp::IpSpoofAttackError: IP spoofing attack?! HTTP_CLIENT_IP="xx.xx.xx.xx" HTTP_X_FORWARDED_FOR="xx.xx.xx.xx"

Wir brauchen nicht diese Art von Sicherheitsüberprüfung, so dass nach einigen googeln um fand ich diese:

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

When an intermediate proxy inserts the user IP address both in the HTTP_CLIENT_IP and the HTTP_X_FORWARDED_FOR, and this address is private, ActionDispatch::RemoteIp raises an IpSpoofAttackError exception.

When an enterprise proxy includes the user's IP address in a header, this will commonly be private. Removing private IP addresses from the chain contained in HTTP_X_FORWARDED_FOR should probably be done only when the address is not an exact match of the one found in HTTP_CLIENT_IP. If it is a match, that should be the user's IP address.

This happens for example with the following environment:

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 (this would be a public IP address)


Ein Update hier vorgestellt:

As a work-around, I've disabled this check in config/application.rb:

config.action_dispatch.ip_spoofing_check = false

Das scheint jedoch in Rails 4 nicht zu funktionieren. Wie lautet der neue Aufruf und wie setze ich ihn auf die ganze Seite?

Antwort

5

Anstatt die Warnung zu deaktivieren, ist es möglicherweise besser, das eigentliche Problem zu beheben. Hier ist meine Umformulierung von dem, was Rails sagen Sie:

This request seems to have come through two different reverse proxies. One of them set the CLIENT_IP header to the user's IP address; the other set the X_FORWARDED_FOR header. One of those values is probably correct, the other probably contains the IP of a reverse proxy, and I have no way to tell which is which. I can't reliably determine this user's IP address, so I'm going to reject the request.

Die „richtige“ Lösung ist zum Festlegen der Header zu stoppen. Dafür müssen Sie herausfinden, wo sie herkommen (ich würde mit Ihrem Bluecoat-Gerät beginnen) und herausfinden, ob beide benötigt werden. Normalerweise verwenden Sie nur das eine oder das andere.

Wenn es sich herausstellt, dass sie beide benötigt werden (ich habe seltsame Dinge gesehen), dann müssen Sie herausfinden, welcher Header zuerst gesetzt wird (vorausgesetzt, es gibt zwei Proxies in der Kette). Dann können Sie eine benutzerdefinierte Middleware schreiben, die den anderen HTTP-Header löscht.

Weitere Hinweise zum Erstellen einer eigenen Middleware finden Sie unter Rails 3 middleware modify request headers. Fügen Sie es vor der RemoteIp-Middleware ein, löschen Sie den Header, der den "schlechten" Wert hat, und Sie sollten gut sein.