APEX-AT-WORK no image

Client IP Adresse in APEX auslesen

Von Tobias Arnhold 4.09.2012
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.

Post Tags:

1 One Comment " Client IP Adresse in APEX auslesen "

daust_de 12 April, 2012 14:08

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.