Anda di halaman 1dari 4

Problemas de seguridad Birt 1. Control de sesiones 2.

Url que da expuesta, servidor y parmetros Esconder el acceso directo al birt mediante programacin web. Encriptar los parmetros. Soluciones

Al empezar a trabajar con BIRT, me di cuenta que tiene un problema de seguridad cuando es utilizado desde otra plataforma que no sea JAVA. El problema es que dejamos la URL expuesta del BIRT, al igual que los parmetros que se envan (sean por el mtodo GET o POST). Esta vulnerabilidad es fcilmente explotada por usuarios con conocimientos mnimos, aun y cuando el BIRT solo tenga permisos de lectura en la base de datos. Encontr la solucin gracias a mis amigos Ddaz y el DrModding. No voy a hablar sobre como hacer un reporte o como utilizar BIRT, Javascript o PHP, hago el manual con la creencia de quien lo lea tenga conocimientos medios de estos lenguajes. As que empezamos con la primera parte: Nota: Para este ejemplo utilizare la encriptacion de 64BYTES, no es la que recomiendo, pero para usar una formula de encriptacion, debe ser creada por cada programador por seguridad. Encriptando los parmetros en BIRT con Javascript

Para empezar, podemos hacer la validacin al recibir los parmetros, o al iniciar el DataSet. Este caso sera en el DataSet, para poder detener la conexin a la base de datos en caso de que un parmetro no pase la validacin. Primero, debemos selecionar nuestro DataSet e irnos a la pestaa de Script.

Seleccionaremos el mtodo beforeOpen y escribiremos la desencriptacion de los parmetros. Como mencione antes, al desencriptacion es de 64Bite, por lo cual quedara de la siguiente forma: var llave= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; var salida = ""; var entrada = ""; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; entrada = params["nombre_del_parametro_de_BIRT"]; entrada = entrada.replace(/[^A-Za-z0-9\+\/\=]/g, ""); while (i < entrada.length) { enc1 = llave.indexOf(entrada.charAt(i++)); enc2 = llave.indexOf(entrada.charAt(i++)); enc3 = llave.indexOf(entrada.charAt(i++)); enc4 = llave.indexOf(entrada.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; salida = salida + String.fromCharCode(chr1); if (enc3 != 64) { salida = salida + String.fromCharCode(chr2); } if (enc4 != 64) { salida = salida + String.fromCharCode(chr3); } } params["nombre_del_parametro_de_BIRT"] = salida;

if(params["nombre_del_parametro_de_BIRT"].NaN){ this.queryText = ""; } Si tenemos duda sobre los comandos que podemos utilizar, as como las variables; mientras se este escribiendo el Script, en la pestaa de Palette podremos ver las diferentes opciones y variables disponibles y su funcionamiento. Se eligi el mtodo beforeOpen, pues al final hay una comparacin con el parmetro; si este no es numero (ya que requiero un ID integer), la sentencia SQL la deja vaca para evitar consumir recursos. De esta manera podemos encriptar cada parmetro o solo los que se requieran. Esto nos dara la URL con los parmetros encriptados; pero esto no es suficiente hay que ocultar por completo al URL de BIRT para evitar ataques de carga entre otras cosas.

Ocultando la URL de BIRT a travs de PHP

Esta parte es la mas fcil y en mi opinin la mas importante. Lo que debemos hacer es leer el archivo de BIRT y mostrarlo en PHP, creando un archivo propio por medio de los HEADER. <?php header("Cache-Control: no-cache, must-revalidate"); header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Para el formato PDF, utilizamos la ruta de BIRT $dest="http://127.0.0.1:80/birtviewer/frameset?__report=report%nombre_del_reporte&__format=pdf"; $len=filesize($dest); //Esta opcion es solo si no se usa la cabecera para HTML // Creamos la cabecera (en este caso para PDF) header("Content-type: application/pdf"); header("Content-Length: $len"); header("Content-Disposition: inline; filename=reporte.pdf"); readfile($dest); ?> Como podemos ver, lo nico que hacemos es leer el archivo de BIRT estando en el servidor y lo mostramos por medio de PHP. Esto oculta la direccin real del BIRT, dejando solo acceso a la direccin del PHP. Obviamente, podemos meter mas seguridad al archivo de PHP, creando accesos por IP, por tiempos, encriptamientos, etc. El ejemplo, solo se refiere al archivo tipo PDF, pero pueden cambiarse las cabeceras para que pueda usarse los dems formatos. En caso de querer usar el BIRT-VIEWER como tal, la cabecera es HTML.

ltimos detalles de Seguridad

Ademas de estos dos mtodos, se debe configurar el BIRT para que solo acepte peticiones del tipo LOCALHOST. Tambin, puedes crear el archivo con PHP una vez ledo de BIRT y enviarlo a la carpeta Temporal, para que de ah se lea. Esto le agrega un plus de seguridad y rendimiento a la aplicacin. Para la configuracin del BIRT para peticiones LOCALHOST y el acceso a la carpeta Temporal del servidor, pueden dirigir sus dudas al DrModding.

Anda mungkin juga menyukai