Saltar al contenido

Evaluación segura de expresiones aritméticas en Javascript

Solución:

puede probar JavaScript Expression Evaluator:

Esta biblioteca es una versión modificada del analizador de expresiones ActionScript de Raphael Graf. Cuando escribí el trazador de funciones de JavaScript, quería un mejor alternativa al uso de la función eval de JavaScript. Actualmente no existe ningún riesgo de seguridad, porque solo puede ejecutar código en su propio navegador, pero no es tan conveniente para las matemáticas (Math.pow (2 ^ x) en lugar de 2 ^ x, etc.).

entonces tu código será así:

console.info ( Parser.evaluate( "2 * (3 + 4)" ) ); //prints 14

Como ya se mencionó, el mayor daño que podría hacer cualquier usuario es más o menos lo que ya podría hacer usando la consola incorporada en cualquiera de los principales navegadores. Sin embargo, si desea restringir el uso del usuario Math propiedades / métodos, puede escribir una expresión regular simple para manejar esto por usted. Algo como esto debería funcionar:

function mathEval (exp) {
    var reg = /(?:[a-z$_][a-z0-9$_]*)|(?:[;={}[]"'!&<>^\?:])/ig,
        valid = true;
       
    // Detect valid JS identifier names and replace them
    exp = exp.replace(reg, function ($0) {
        // If the name is a direct member of Math, allow
        if (Math.hasOwnProperty($0))
            return "Math."+$0;
        // Otherwise the expression is invalid
        else
            valid = false;
    });
    
    // Don't eval if our replace function flagged as invalid
    if (!valid)
        alert("Invalid arithmetic expression");
    else
        try { alert(eval(exp)); } catch (e) { alert("Invalid arithmetic expression"); };
}

Me doy cuenta de que no querías usar eval por razones de seguridad, pero la expresión regular debería hacerlo bastante seguro, ya que descarta cualquier palabra que no sea directo propiedades de la Math objeto y la mayoría de los operadores JS no matemáticos, incluido el operador de asignación (=) y operadores binarios. El método más difícil sería escribir un tokenizador para analizar la expresión matemática, porque no es un lenguaje regular.

Siéntase libre de intentar romper el ejemplo de trabajo que escribí, si puede o si nota un problema, deje un comentario y veré qué puedo hacer para solucionarlo.


Nota: Yi Jiang mencionó [in JavaScript chat](https://chat.stackoverflow.com/rooms/17/javascript) que también podría ser útil permitir minúsculas para cosas como `Math.PI`. Si ese es el caso, puede agregar la siguiente instrucción `else if` en la función de reemplazo:

else if (Math.hasOwnProperty($0.toUpperCase())
    return "Math."+$0.toUpperCase();

Agréguelo entre el if y else declaración (ejemplo).

Puede usar el analizador de expresiones avanzado de math.js, que no usa la evaluación de JavaScript.

http://mathjs.org

Uso:

var ans = math.evaluate('2 * (3 + 4)');

o use el analizador (que admite asignaciones de funciones y variables):

var parser = math.parser();
var ans = parser.evaluate('2 * (3 + 4)');
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *