Meine App verfolgt die IP-Adresse von Nutzern, die sich auf der Website anmelden. Das Tracking funktionierte gut auf einem normalen Webserver (wir waren auf Hostgator), schien aber seltsame IP-Adressen zu verfolgen, als wir auf eine PaaS-Plattform umschalten (Pagodabox) Nachdem sie mit Pagodabox-Support gesprochen hatten, informierten sie mich, dass der IPs-Codeignierer aufging die IPs der Load Balancer / Router von Pagodabox und um die tatsächliche IP-Adresse eines Benutzers zu erhalten, müsste ich HTTP_X_FORWARDED_FOR
Ich habe die Code-Funktion $this->input->ip_address()
des Codeigniters verwendet, um die IP des Benutzers wiederherzustellen. Ich schaute auf die Funktion und bemerkte, dass sie eine Art von Funktionen hatte, um den HTTP_X_FORWARDED_FOR
IP-Wert zu erhalten, aber ich bin mir nicht sicher, wie ich es benutzen soll. Muss ich etwas in der Konfiguration ändern / hinzufügen?
EDIT: Nachdem ein paar Benutzer darauf hingewiesen haben, wo ich in die Liste der IP-Adressen von Load Balancers aufnehmen soll, kam eine neue Frage auf: Was würde ich tun, wenn sich die IP-Liste häufig ändert? (dh keine statische IP, alle dynamisch)
Ich bin mir sicher, dass Sie das inzwischen gelöst haben, aber ich dachte, ich würde die richtige Antwort für zukünftige Referenz veröffentlichen. Ich bin auf dasselbe Problem gestoßen (Verwenden von Lastenausgleichsfunktionen in AWS mit einer CodeIgniter-App.) Wie Sie bereits erwähnt haben, ist es einfach, die richtige IP-Adresse hinter einem Lastenausgleichsmodul oder einer anderen verteilten Umgebung mithilfe des Headers HTTP_X_FORWARDED_FOR zu erhalten. Das Problem ist, wie implementieren wir diese Lösung in CodeIgniter korrekt? Wie die vorherige Antwort zeigt: Schreibe deine eigene IP-Funktion. Das Problem dabei ist, was ist, wenn ip_address () in Ihrer App aufgerufen wird? Wäre es nicht besser, diese Funktion zu überschreiben (mit einer, die auf die richtige Überschrift schaut)? CodeIgniter hat hierfür einen praktischen Mechanismus, der praktisch ist:
Die Lösung besteht darin, die Klasse CodeIgniter Input zu erweitern, indem Sie in / application / core eine neue Klassendatei namens MY_Input.php erstellen (MY_ ist ein konfigurierbares Präfix für Erweiterungen, das Sie in Ihrer Konfigurationsdatei ändern können). Mit Erweiterungen können Sie eine Funktion mit dem Namen SAME als ursprüngliche Klassenmethode erstellen, ohne dass etwas kaputt geht, und ohne Core-Dateien zu bearbeiten. CodeIgniter verwendet stattdessen nur Ihre neue Methode. Ihre erweiterte Eingabeklasse sieht etwa so aus:
%Vor%Auf diese Weise haben wir das Kernverhalten geändert, ohne das Framework zu hacken, und bestehende Aufrufe von ip_address () in Ihrer App verwenden nun Ihre Methode.
In Bezug auf den Umgang mit anderen IPs in der Kette sollte es, wenn Sie nur an der Client-IP interessiert sind, keine Rolle spielen. Zumindest bei AWS Load Balancers scheint der HTTP_X_FORWARDED_FOR-Header immer die korrekte Client-IP zu enthalten.
Die Lösung von Oliver funktioniert, aber unter bestimmten Umständen ist es besser, Folgendes zu verwenden, wenn Sie die Proxy-IP-Adressen kennen, die verwendet werden. Bearbeiten Sie Ihre Datei application / config / config.php so, dass sie Folgendes enthält:
%Vor%Beachten Sie auch, dass die Kopfzeileninformationen normalerweise nicht zuverlässig sind und nicht für sicherheitsrelevante Zwecke verwendet werden sollten. Zum Beispiel ist es nicht ungewöhnlich, Administratoren zu beschränken, nur einige weiß gelistete IP-Adressen zu verwenden.
Ich bin auf eine Version der Thava-Lösung gestoßen, die sich hervorragend für Situationen eignet, in denen sich die Load-Balancer-IPs ändern können (wie AWS) und die CIs-Konfigurationsdateien nativ nutzt. Wenn Sie wissen, dass Sie hinter einem LB laufen, können Sie config.php wie folgt ändern:
%Vor%Wissen, dass REMOTE_ADDR immer die aktuelle LB ist.
Danke an Eric Brown hier Ссылка
Ich weiß, dass es eine gute Antwort gibt, die für Ihre Frage relevant ist und von Ihnen akzeptiert wird, aber für zukünftige Benutzer teile ich eine Funktion, die perfekt für mich in allen Situationen funktioniert.
%Vor%Ich hatte die gleiche Situation bei der Arbeit, außer dass die IPs nicht wirklich "dynamisch" waren, aber die "Infrastruktur-Leute", die Proxy-Server und Load-Balancer verwalten, um sie aus unbekannten Gründen zu ändern. Also mussten wir verhandeln und eine Lösung finden, die einen Haken in ihrem Konfigurations- / Provision-Management-Tool setzt, um irgendwo eine Konfigurationsdatei zu schreiben (in einem Ordner, auf den der Benutzer mit unserem Apache / PHP zugreifen kann).
Also habe ich einen CI-Hook verwendet, um diese Datei im System Bootstrap zu lesen, um meine App-Konfiguration zu ändern und Werte wie Proxy-IP-Liste, Cache-Pfad, Cookie-Domain usw. zu aktualisieren.
In Ihrem Fall können Sie die angegebene Load-Balancer-IP in $config['proxy_ips']
( application/config/config.php
) hinzufügen, zum Beispiel:
Je nach Ihrem dynamischen IP-Problem können Sie den IP-Bereich für das Load-Balancer-Netzwerk maskieren, zum Beispiel:
%Vor%Die Maskenfunktion ist in der Codeigniter 3
möglich
Während $this
auf CI-Instanz verweist.
Diese Methode berücksichtigt die Einstellung $ config ['proxy_ips'] und gibt die gemeldete HTTP_X_FORWARDED_FOR-, HTTP_CLIENT_IP-, HTTP_X_CLIENT_IP- oder HTTP_X_CLUSTER_CLIENT_IP-Adresse für die zulässigen IP-Adressen zurück.
Tags und Links php codeigniter