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