Plugin Cache - Client IP

Ich hab ein Plugin entwickelt, das die Client-IP abfragt und anhand von dieser eine Datenbankabfrage startet. Ich greif über den Wert $_SERVER[‚REMOTE_ADDR‘] auf die IP zu. Das ganze mach ich im RouteSoubscriber nach dem Event ‚Enlight_Controller_Action_PostDispatchSecure_Frontend‘.

Im Live-System habe ich festgestellt, dass die Client-IP gecacht wird und letztenendlich alle Anfragen mit der gleichen IP erscheinen.

 

Gibt es eine Möglichkeit den Cache für dieses Plugin zu deaktivieren oder eine andere Möglichkeit auf die IP jedes Requests zuzugreifen ohne Caching?

In einem anderem Post hier im Forum hab ich die Möglichkeit gesehen, mit Enlight_Controller_Request_Request :: getClientIp() auf die IP zuzugreifen, aber darauf bekomm ich kein Zugriff.

Vielleicht über Request()->getClientIp()

Btw. ist auch $_SERVER[‘REMOTE_ADDR’]  kein verlässicher Indikator für die IP des Besuchers. Wenn der einen Proxy nutzt (Varnish, SSL-Proxy, Loadbalancer, …). Dann ist die IP-Adresse in X-FORWARDED-FOR: X-Forwarded-For – Wikipedia

In $_SERVER[‘REMOTE_ADDR’]  steht dann die IP des Proxies.

 

kein verlässicher Indikator

Jetzt bin ich etwas neugierg geworden. 

HTTP_X_FORWARDED_FOR steht nicht immer zur Verfügung. Benutzt jemand z.B. einen Tor Browser so steht dieser Wert nicht zur Verfügung. Und für Firefox gibt es eine Erweiterung, der diesen Eintrag vortäuscht. Da fahre ich doch mit REMOTE_ADDR oder HTTP_X_REAL_IP besser?

@R4M schrieb:

kein verlässicher Indikator

Jetzt bin ich etwas neugierg geworden. 

HTTP_X_FORWARDED_FOR steht nicht immer zur Verfügung. Benutzt jemand z.B. einen Tor Browser so steht dieser Wert nicht zur Verfügung. Und für Firefox gibt es eine Erweiterung, der diesen Eintrag vortäuscht. Da fahre ich doch mit REMOTE_ADDR oder HTTP_X_REAL_IP besser?

Naja, wie gesagt steht in REMOTE_ADDR bei einem Proxy in der Regel die IP des Proxies und nicht die des Besuchers. Damit Shopware die IP des Benutzers hinter einem Proxy noch tracken kann, muss man i.d.R. die trustedProxies konfigurieren - wenn das in der config.php eingerichtet ist, wertet Shopware die x-Header aus.

Quasi „Wenn in der REMOTE_ADDR die IP des trustedProxies steht, dann werte X-FORWARDED-FOR aus, sonst ignoriere das“.

Das ist ja Standard vorgehen bei Symfony: How to Configure Symfony to Work behind a Load Balancer or a Reverse Proxy (Symfony Docs)

Insofern muss einem nur bewusst sein, dass in REMOTE_ADDR eben nicht immer die IP des Clients steht, sondern auch häufig die IP des Proxies. 
Das hat mit dem Client nicht viel zu tun, da das X-FORWARDED-FOR vom Proxy gesetzt wird.

Also ich würde auch auf real-ip setzen. Problem in Shopware ist hier jedoch, das getClientIP() immer nur

return $this->getServer('REMOTE_ADDR'); 

zurückschmeißt.

Das ist auch alles nicht Hookable oder sonst irgendwie gut anzufassen und um Proxy-Checks zu erweitern. Habe da auf jeden Fall direkt mal keinen Ansatz gesehen bei welchem man das zufriedenstellend hinbiegen kann.

Ich würde einen check auf real-ip machen wenn das leer ist, dann als fallback die getClientIp aufrufen und den Wert nehmen. 

Also ganz banal und wie eigentlich nicht empfohlen eiskalt auf 

$_SERVER['HTTP_X_REAL_IP'];

 

Danke für alle Kommentare bisher.

@R4M schrieb:

Vielleicht über Request()->getClientIp()

Danke für den Hinweis. Leider gibts die Funktion nicht - Fehlermeldung: „Call to undefined function MyPlugin\Subscriber\Request()“. Oder muss ich diese erst importieren?

 

Bzgl. der verschiedenen Methoden wie ich auf dei IP zugreife: das Problem ist nicht eine IP zu erhalte. Das will ich an der Stelle erst mal vernachlässigen.

Das Problem ist: 

  • User A mit IP 1.1.1.1 greift zu und seine IP wird richtig erkannt.
  • Danach greift User B mit IP 2.2.2.2 zu, das Plugin gibt aber als IP 1.1.1.1 - vom User A aus.

Wie kann ich an der Stelle das Caching umgehen oder einen aktuellen Wert erhalten?

Ich häng mich hier mal mit drauf, ich hab nämlich ganz ähnliche Probleme nur für einen anderen Anwendungsfall und bisher hatte niemand eine Lösung…

https://forum.shopware.com/discussion/comment/221814/

Wenn du es aber nur an einer einzigen Stelle brauchst ist evtl. ein ESI-Tag für dich die Lösung. Für mich ist er es nicht…

Matt

Danke für den Hinweis. Leider gibts die Funktion nicht - Fehlermeldung: „Call to undefined function MyPlugin\Subscriber\Request()“. Oder muss ich diese erst importieren?

Ich weis nicht wie dein Plugin aufgebaut ist und an welcher Stelle du das Request benötigst. Das muss natürlich angepasst werden. Daher hier nur ein Beispiel (ungetestet): 

public static function getSubscribedEvents() {
  $events = Array(
   'Enlight_Controller_Action_PostDispatchSecure_Frontend' => 'onFrontendPostDispatch'
  );
  return $events;
}

public function onFrontendPostDispatch(\Enlight_Event_EventArgs $arguments) {
  $controller = $arguments->getSubject();
  $request = $controller->Request();
  $ip = $request->getClientIp();
}

 

@msslovi0 schrieb:

Wenn du es aber nur an einer einzigen Stelle brauchst ist evtl. ein ESI-Tag für dich die Lösung. Für mich ist er es nicht…

Danke für den Hinweis, das löst das Problem!

 

@R4M - der Wert aus $request->getClientIp() wird leider genauso gecached. Danke trotzdem für das Snippet.

Hi,

die Startseite etc. wird in Shopware mit dem HttpCache gecached.

Du könntest den HttpCache deaktivieren, ein ActionTag nutzen oder refreshStatistics nutzen (dieser Aufruf wird nämlich nicht gecached)

https://developers.shopware.com/developers-guide/http-cache/#search-results

Gruß Heiner

@h_lohaus schrieb:

Hi,

die Startseite etc. wird in Shopware mit dem HttpCache gecached.

Du könntest den HttpCache deaktivieren, ein ActionTag nutzen oder refreshStatistics nutzen (dieser Aufruf wird nämlich nicht gecached)

https://developers.shopware.com/blog/2015/02/11/understanding-the-shopware-http-cache/#search-results

https://developers.shopware.com/developers-guide/http-cache/#search-results

Gruß Heiner

Aktuell haben wir es mit Action Tags gelöst. Was genau ist refreshStatistics? Dazu finde ich keine Doku - auch nicht in den Links, oder hab ich was übersehen?