miércoles, 30 de agosto de 2017

Cuidado con lo que envías en el servicio oData

Para la mayoría de los lectores, que ya estarán metidos en materia fiorística (término que, por supuesto, me acabo de inventar), puede que este post resulte más que evidente. Pero quizá no lo sea para aquellos que se acaban de sumergir en esta materia del Gateway, los servicios oData y las aplicaciones SAPUI5.

Y es que gracias a los servicios oData podemos enviar información a nuestra aplicación SAPUI5 y luego allí decidimos qué mostramos o que no. ¡Pero la información se sigue enviando! Aunque no la veamos bien pintadita en la pantalla, podemos descubrir fácilmente lo que se ha enviado sin ser unos genios informáticos. ¡Si hasta yo sé cómo hacerlo! Nos basta con una simple tecla: F12.

Así que, cuando creemos nuestro propio servicio oData (proceso que podemos recordar en este post), sólo debemos enviar aquello que el receptor realmente tenga permiso para leer. La parte web sólo se tiene que preocupar en si un dato se pinta o no, pero no en si tienes permiso o no para recibir ese dato.

Veamos lo que no debemos hacer y cómo descubrir toda la información que se envía, aunque la aplicación no nos lo muestre.


Ejemplo de lo que no debemos hacer


Para entenderlo, vamos a usar un ejemplo muy sencillo y muy tonto: Imaginemos que tenemos una aplicación para que el empleado vea datos de su departamento, tales como el nombre de sus compañeros y sus direcciones de email. Además, queremos mostrar el coste total del departamento, que es la suma de salarios de todos los compañeros.

Para pasar toda esa información, creamos un servicio oData con una colección que nos listará los siguientes datos de cada empleado: nombre, email y salario.
El salario individual no lo vamos a pintar, pero con su suma en la aplicación web obtendremos el salario del departamento:

Morgoth - morgoth@departamentooscuro.com - 100 000 euros.
Sauron - sauron@departamentooscuro.com - 80 000 euros.
Rey Brujo - reybrujo@nazgul.departamentooscuro.com - 65 000 euros.
Jorge - becario@orcos.departamentooscuro.com - 15 000 euros.

Salario del Departamento Oscuro : 100 000 + 80 000 + 65 000 + 15 000 = 260 000 euros

¿Cual es el problema? Que yo, con saber sólo una pizquinina y gracias a las herramientas de desarrollador que incorporan los navegadores modernos (tecla F12), podré ver todas las llamadas que se realizan y la información que me devuelve el servidor, se vaya a mostrar o no en la página.

Así que podré ver tanto mi sueldo, como el de mi compañero y el de mi jefe. Y me enfadaré porque mi compañero (el Rey Brujo) cobra mucho más que yo y no hace ni el huevo, por supuesto.

¿Cómo puedo leer todo lo que me devuelve la llamada?


Como mencionaba antes, podemos ver todo el contenido que nos devuelve una llamada a un servicio oData gracias a las herramientas de desarrollador que incorporan los navegadores modernos. Accederemos a ellas a través de menú o, normalmente, con la tecla F12 (aunque la ayuda nos indique otra combinación de teclado).

El acceso a menú es muy parecido en los siguientes tres navegadores: Internet Explorer, Google Chrome y Mozilla Firefox.

Tomemos un ejemplo visual mediante la aplicación de tabla de empleados que habíamos creado en posts anteriores y que consultaba la colección de Employees del servicio Northwind. Esa colección incluye una propiedad "Title" que no se pintaba en la aplicación.

Así que pulso F12 para cargar las herramientas y voy a la pestaña Red Network.

Después, recargo la aplicación y comienzo a ver las llamadas que recibo, incluyendo las llamadas a los servicios oData, que no dejan de ser llamadas a recursos http(s). Cualquier cosa que veamos que incluya el nombre de la colección o $batch (una agrupación de llamadas en una única llamada) nos interesará.

En la pestaña de Network en Chrome, tras recargar la aplicación, veré las llamadas que voy haciendo. Ojo a ese $batch con buena pinta

NOTA: En Internet Explorer 11, en la pestaña Red, nos hará falta activar el registro de llamadas dándole al botón de Play, ya que por defecto nos ha salido vaguete y no nos informa de nada.


Si selecciono una llamada del listado obtenido, podremos ver información adicional, como por ejemplo:


  • La información que hemos solicitado en la pestaña Encabezados de solicitud, Headers o Cabecera (u otros nombres similares, dependiendo siempre del navegador usado).
  • La información que hemos recibido en la pestaña Cuerpo de respuesta/Response/Respuesta.

En la imagen de ejemplo se está usando Chrome.

Es en esa segunda pestaña donde vamos a descubrir lo que nos ha devuelto la colección del servicio oData al completo. Vale, en esa pestaña es más desagradable de ver que un troll de David el Gnomo, pero que se acaba entendiendo.

El caso es que en la aplicación no veo el título de Steve Buchanan pero en la llamada al servicio oData sí... ¿debería poder verlo? Esta propiedad puede no ser importante, pero imagínate que se hubiese enviado el salario

Cómo determinamos entonces lo que se puede ver


Para determinar lo que se podrá ver o no en la aplicación, tenemos que ir al origen de los datos, que es el Back-End. Es allí donde debemos comprobar siempre la información que enviamos y gestionar las autorizaciones.

Si el usuario no tiene permiso para visualizar un determinado valor, podemos enviar la propiedad correspondiente en blanco, no enviar nada de esa entidad/colección o incluso generar un error, según necesitemos.

Aunque dependerá de cada caso particular: En el ejemplo del salario de antes, lo que podríamos hacer es crear dos entidades: Una que devuelva los datos de los empleados y otra que devuelva los datos del departamento, entre ellos el gasto total. En el código ABAP nos podríamos saltar la autorización de leer el saldo de cada empleado, porque sabemos que el resultado final es un dato que sí que se puede informar sin problemas (o eso nos han jurado los de recursos infrahumanos, ya veremos luego cuando haya que pasar alguna auditoría oscura).

Pero, en resumen, NUNCA dejaremos la decisión de qué datos "confidenciales" se pueden ver y cuales no en manos del front-end, ni aunque la propiedad luego no se pinte.

Sí, vale, este post ha resultado ser muy evidante. Pero todos hemos comenzado de cero y a veces lo evidente nos lo tienen que contar.

No hay comentarios:

Publicar un comentario