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.
Gracias por la información, Enrique.
ResponderBorrarUna 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.
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