• Leistungsspektrum
    Die passenden Lösungen für Ihre Anforderungen.
    Mehr Details unter der Rubrik: Leistungen
  • Professionelle Anwendungen
    Holen Sie mehr aus Ihren APEX Applikationen heraus.
  • Neueste Designs
    Nutzung von erweiterten Web 2.0 Möglichkeiten und Entwicklung von Corporate Designs
  • Individuelle Lösungen
    Entwicklung von Business-Anwendungen genau nach Ihren Wünschen.
  • Upgrade Lösungen
    Weiterentwicklung bestehender Anwendungen.
  • Schulungen und Vorträge
    Die passenden Schulungen genau für Sie zugeschnitten. Beispiel: Navigationsbeispiele
  • Plugins und Third Party Erweiterungen
    Erweitern Sie die Funktionalität ihrer Anwendungen mit einem modularen Entwicklungsansatz.

09 April, 2012

Client IP Adresse in APEX auslesen

Um die Client-IP-Adresse mit Hilfe von PL/SQL auszulesen, können Sie zwei unterschiedliche Prozeduren verwenden:
select
owa_util.get_cgi_env('REMOTE_ADDR')
from dual;

select 
sys_context('userenv','ip_address')  
from dual;
Das Ganze funktioniert super solange Sie keinen vorgeschalteten Proxy Server verwenden! Aber auch dafür gibt es einen Workaround. Stellen Sie folgende Einstellung in Ihrer http.conf ein:
RewriteCond %{REMOTE_ADDR} (.*)
RewriteRule .* - [E=REMOTEA:%1]
RequestHeader set X-Oracle-Cache-User "%{REMOTEA}e"

# Außerdem müssen folgende Einstellung mit gesetzt werden:
# 1. Konfiguration der RewriteRule muss in einem VirtualHost hinterlegt sein:
<VirtualHost 192.168.0.1:80>

# 2. Rewrite muss aktiviert werden
RewriteEngine on

# 3. ModHeader muss mit geladen werden
LoadModule headers_module modules/mod_headers.so
Die Lösung wurde von Dietmar Aust im Oracle APEX Forum auch noch tief greifender beschrieben: https://forums.oracle.com/forums/thread.jspa?messageID=1262928&#1262928 
Weitere Forum Einträge zu Thema:
https://forums.oracle.com/forums/thread.jspa?threadID=926109
http://redmine.lighttpd.net/boards/2/topics/3626
Das auslesen der Info in PL/SQL sieht dann so aus:
select
owa_util.get_cgi_env('HTTP_X_ORACLE_CACHE_USER')
from dual;
Info: Es kann vorkommen das andere Einstellungen verhindern das die Variable richtig durchgeroutet wird.

1 comment:

daust_de said...

Hallo Tobias,

der Ansatz ist zwar richtig, in den meisten Fällen jedoch zu kompliziert.

Grundsätzlich muss APEX nur über das OWA_TOOLKIT die CGI-Variable X-FORWARDED-FOR auslesen können.

Wenn z.B. für das mod_plsql folgendes spezifiziert wird:

...
PlsqlCGIEnvironmentList X-FORWARDED-FOR


kann man in APEX die Client-Adresse einfach mit owa_util.get_cgi_env('X-FORWARDED-FOR') auslesen.

Diese Konfiguration ist je nach Gateway (mod_plsql, apex listener, embedded plsql gateway) unterschiedlich. Da es leider einen Bug im plsql gateway der XE10g gab (und ich glaube, immer noch gibt), konnten keine zusätzlichen CGI-Variablen an das Gateway übergeben werden. Daher verwende ich die in diesem Kontext vom mod_plsql nicht verwendete CGI-Variable X-Oracle-Cache-User als Workaround.

Das Verfahren ist jedoch ziemlich kompliziert und da der APEX Listener kostenlos ist, sollte man diesen Weg bevorzugen.

Viele Grüße,
Dietmar.