Cambio en la forma de encriptar parametros en GX17

 Estamos en medio de una migración de GX16 a GX18. 
Un usuario nos reportó un problema, con links viejos que tenia en un QR (generado en GX16) que daba error al acceder a la aplicación en GX18. 

El error que da es 

403 - Forbidden: Access is denied.


Investigando el tema, encontramos que se cambió en el SAC 49927

SAC #49927: Se cambia la función de encriptación de parámetros para usar el alfabeto Base64 URL Safe
Abstract

Se cambia el mecanismo de encriptación de parámetros (cuando se tiene Encrypt URL Parameters <> None). Se pasa a utilizar una función que retorna
un string con caracteres del alfabeto Base64 URL Safe. Con esto se evita generar caracteres del alfabeto Base64 como la barra (/) o el signo de más (+).

Descripción Detallada

Hasta el momento la función de encriptación de parámetros generaba un string del alfabeto Base64.
Esto incluye los caracteres:

62: /
63: +

Que el Query String de la URL (encriptada) venga con esos caracteres podría causar algunos problemas.

Por ejemplo el "+" es detectado por algunos firewalls como posible signo de OS command injection.
La "/" cuando se generaban dos juntas (//) algunos módulos (URLRewirte) los sustituyen
por una única barra (pensando que era un carácter de escape) y entonces podía presentarse
un error 403 Forbidden con el generador C# (SAC #49924)

Se cambia entonces la función para utilizar un caracter del alfabeto Base64 URL and Filename Safe,
donde los últimos dos caracteres se sustituyen por:

62: - (minus)
63: _ (underline)


------------------------------------------
Las pruebas GX16 a GX16.

Habíamos hecho pruebas de llamadas desde GX18 a GX18 y funcionaban bien.

No habiamos tenido en cuenta en nuestras pruebas las llamadas realizadas desde la aplicación vieja
a la nueva.

La solución que encontramos fue renombrar el objeto referenciado y ponerle _v18 al final, y
crear un objeto nuevo que solo reciba un string de parámetros, hace replaces para dejar la encriptacion como lo espera GeneXus 18 y llamar al otro objeto




WebPanel1
Parm(in:&ParmsEncriptados16)
Event Start
    &ParmsEncriptado18 =  CambioEncriptacion_16_a_18(&ParmEncriptado16)
   &Url = ArmoUrlServicio(&HttpRequest, &ParmsEncriptados18)
   Link(&Url)
EndEvent 

Como conclusión, tenemos que mejorar la forma de testear la aplicación, probando desde la aplicación vieja llamando a la nueva versión.

Comentarios

  1. Gracias por la información, Enrique.

    Una consulta:

    ¿El [CambioEncriptacion_16_a_18] es un procedimiento? ¿Qué haces ahí?
    ¿Y lo mismo para ArmoUrlServicio?

    Además, ¿para qué usas el &HttpRequest?

    Entendí el texto completo, pero la parte final del gráfico no me quedó muy clara, por eso te hago estas preguntas para recopilar más información.

    ResponderBorrar
  2. Si, es un procedures que hace los replace de texto, para dejarlo con el formato de parametros nuevos. El httprequest es para poder recuperar la informacion de host, port, etc para poder armar la url. De esta forma queda mas generico y se puede usar en varias instalaciones.

    ResponderBorrar

Publicar un comentario

1) Lee el post
2) Poné tu opinión sobre el mismo.
Todos los comentarios serán leidos y la mayoría son publicados.

Entradas más populares de este blog

Aplicación monolítica o distribuida?

La nefasta influencia del golero de Cacho Bochinche en el fútbol uruguayo

Migrando de GeneXus 9.0 a GeneXus X.