Dic
04
2007

BIRT – Seguridad a travez de Javascript y PHP

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 parámetros que se envían (sean por el método GET o POST). Esta vulnerabilidad es fácilmente explotada por usuarios con conocimientos mínimos, aun y cuando el BIRT solo tenga permisos de lectura en la base de datos. Encontré la solución 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 parámetros en BIRT con Javascript

Para empezar, podemos hacer la validación al recibir los parámetros, o al iniciar el DataSet. Este caso sera en el DataSet, para poder detener la conexión a la base de datos en caso de que un parámetro no pase la validación.
Primero, debemos selecionar nuestro DataSet e irnos a la pestaña de Script.

x3.jpg
Seleccionaremos el método “beforeOpen” y escribiremos la “desencriptacion” de los parámetros. Como mencione antes, al desencriptacion es de 64Bite, por lo cual quedaría 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 pestaña de Palette podremos ver las diferentes opciones y variables disponibles y su funcionamiento.

Se eligió el método “beforeOpen“, pues al final hay una comparación con el parámetro; si este no es numero (ya que requiero un ID integer), la sentencia SQL la deja vacía para evitar consumir recursos.

De esta manera podemos encriptar cada parámetro o solo los que se requieran. Esto nos daría la URL con los parámetros 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 través de PHP

Esta parte es la mas fácil y en mi opinión 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/birt-viewer/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 dirección real del BIRT, dejando solo acceso a la dirección 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 demás formatos. En caso de querer usar el BIRT-VIEWER como tal, la cabecera es HTML.

  • Últimos detalles de Seguridad

Ademas de estos dos métodos, se debe configurar el BIRT para que solo acepte peticiones del tipo LOCALHOST. También, puedes crear el archivo con PHP una vez leído 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 aplicación. Para la configuración del BIRT para peticiones LOCALHOST y el acceso a la carpeta Temporal del servidor, pueden dirigir sus dudas al DrModding.

Written by Antioroku in: Informatica | Etiquetas: , , ,

6 comentarios »

  • vzuara dice:

    Hola, muy bueno tu tutorial, pero me aparece un problema, cuando lo utilizo con firefox funciona al 100% pero cuando lo utilizo con el ie 7 no funciona, alguna sugerencia??  (Seleccionar comentario)

  • Antioroku dice:

    Mi primer sugerencia seria que usaras FireFox… pero bueno, la solución es fácil:

    if(ereg(“Firefox”,$_SERVER["HTTP_USER_AGENT"])){
    header(“Content-type: application/pdf”);
    header(“Content-Disposition: inline; filename=reporte.pdf”);
    }else{
    header(“Content-type: application/octet-stream”);
    header(‘Content-Disposition: attachment; filename=”reporte.pdf”‘);
    }

    Lo único que le estamos indicando es que si es FireFox lo muestre en pantalla, en caso de no serlo, que lo descargue al usuario para que este pueda verlo en su computadora. ¿Cual fue el problema originalmente? Bueno se debe básicamente a que IE no reconoce el PDF leído desde PHP como seguro, así que hay que enviarlo como archivo adjunto al cliente.  (Seleccionar comentario)

    • cheli dice:

      Hola Antioroku,
      Tengo un problema con la seguridad de BIRT al que le llevo dando vueltas ya casi un mes, basicamente mi problema es el que tu planteas en este tutorial, asì que procedì a probarlo obteniendo un excelente resultado para pdf, pero sin obtener resultado alguno para html. Podrìas comentarme como hacer lo de los headers para HTML y sin que se descargue, sino que se muestre directamente?

      Bueno , gracias de antemano y espero que leas esto pronto. Un saludo.  (Seleccionar comentario)

      • Antioroku dice:

        Si no me equivoco es con:

        header(“Content-type: text/html”)

        o bien puedes intentar con:

        header(“Content-type: text/plain;charset=iso-8859-1″);
        header(“Content-type: text/plain; charset=UTF-8″);

        Dependen de la codificacion que uses, o bien quitar la codificacion y usar texto simple.
        header(“Content-type: text/plain”)  (Seleccionar comentario)

    • cheli dice:

      Otra dudita, esta vez sobre la encriptacion.
      Perdoname por mi torpeza, pero no tengo ni idea de criptografia, antes de preguntar aki he estado buscando por internet a ver si encontraba el codigo de algùn algoritmo de encritacion-desencriptacion que pudiese usar para mi prosito en BIRT. Se que hay muchos por internet, pero no he conseguido aclararme, asi que si no te importa muxo podrias ponerme el codigo de la encriptacion, a ser posible en php(sino es posible , pos en java que ya lo traduzco yo)weno gracias , y perdon por las molestias.

      PD: perdon por la falta de tildes , pero estoy un teclado francés y aki solo se pueden poner las tildes en la e la a y la u.  (Seleccionar comentario)

  • jinete85 dice:

    Hola Antioroku!

    Voy a empezar a hacer mi proyecto de fin de carrera y he visto que controlas bastante de BIRT. De hecho es de los mejores tutoriales en castellano que he visto. ¿Podemos ponernos en contacto por si me surgen dudas o me quedo estancado?

    Gracias por adelantado! Un saludo.  (Seleccionar comentario)

RSS feed for comments on this post. TrackBack URL


Leave a Reply

Powered by WordPress | Theme: Aeros 2.0 by TheBuckmaker.com