AX TIP: Ejecutar una expresión matemática desde X++

Un truco antiguo, pero muy útil en algunos casos, es la posibilidad de utilizar el compilador de X++ para calcular expresiones matemáticas. Una simplificación de este interprete matemático está implementada en todos los campos numéricos de la aplicación, donde, en vez de un número, se puede introducir una expresión sencilla. Por ejemplo: +15+7-10/3

El compilador va un poco mas ayá y nos permite utilizar funciones matemáticas más complejas. La lista completa de funciones, según la documentación, es: abs, acos, asin, atan, corrFlagGet, corrFlagSet, cos, cosh, decRound, exp, exp10, frac, log10, logN, power, round, sin, sinh, tan, tanh y trunc, aunque probablemente haya más, la lista de funciones en MSDN no ha sido nunca totalmente completa.

Para poder interpretar estas funciones utilizamos la clase XppCompiler, de la que hablaré también en el siguiente artículo dentro de unos días, de esta forma:

static void JAEE_XppCompiler_Math(Args _args)
{
    XppCompiler comp;
   
    str expr = "sin(3 * 3.14159265358979323 / 2)";

    new ExecutePermission().assert();
   
    comp = new XppCompiler();
    if (comp.compileExpr(expr))
    {
        info(comp.execute());
    }
    else
    {
        throw error("Expresión inválida.");
    }
   
    CodeAccessPermission::revertAssert();
}

La clase XppCompiler es una de las llamadas API’s seguras del sistema, y por tanto, son un riesgo para la seguridad de la aplicación (pueden permitir inyección de código X++ en las formulas, por ejemplo). Antes de utilizar esta clase en producción es necesario tener en cuenta la seguridad del código. Más información:

4 comentarios
  • jaestevan
    julio 16, 2015

    No. El API de Bing ha cambiado mucho de desde entonces, dudo que el código que publiqué siga funcionando, aunque la idea se mantiene.

    Pero eso no corresponde a este artículo 😉

  • alejandro
    julio 16, 2015

    Gracias por la información!

    He leido tambíen tu articulo sobre: la traduccion automatica de etiquetas. Seguiste desarrollando el proyecto?

    Gracias!

  • jaestevan
    julio 15, 2015

    Hola Alejandro,

    Hay que tener cuidado cuando se usan estas clases, más que nada porque esto es lo que recomienda Microsoft, como te explica aquí:

    https://msdn.microsoft.com/en-us/library/xppcompiler.executeex.aspx

    Hay ciertos métodos que se ejecutan bajo CAS, lo que requiere permisos de desarrollador para ejecutarlos lo que es más seguro, pero entonces un usuario “normal” del sistema no podría usar esta funcionalidad y a veces es necesario.

    En principio no tengo ejemplos de inyecciones de código, pero si recomiendan seguir ciertas pautas lo más razonable es hacerles caso, por si acaso. Si no las seguimos porque los requerimientos nos fuerzan a permitir a los usuarios ejecutar acciones “no seguras” del API, al menos tenemos que saberlo para poder buscar otras soluciones o simplemente marcar esa funcionalidad como una vulnerabilidad.

    Por ejemplo, puede que un usuario necesite permisos para ejecutar un código que cualquier usuario puede editar en un formulario de AX. Esto sería muy peligroso, pero si el usuario no puede ver ese formulario con el editor, simplemente ejecutar el código como parte de un proceso, el proceso en sí sería seguro aunque el uso de la API no lo sea. No se si me explico.

    Saludos.

  • alejandro
    julio 15, 2015

    Hola,

    Podrías poner un ejemplo de como insertar código X++ en las formulas?

    Por cierto, el libro está fantastico.

    Un saludo.