Como ya se ha mencionado, la mayoría de los daños que cualquier usuario podría hacer es más o menos lo que ya podían hacer uso de la consola incorporada en cualquiera de las principales navegadores Sin embargo, si desea restringir al usuario a usar las propiedades/métodos Math
, 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"); };
}
Soy consciente de que no desee utilizar eval
por razones de seguridad, pero la expresión regular debe dejar muy seguro, ya que descarta cualquier palabra que no son propiedades directas de el objeto Math
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.
No dude en intentar y romper el working example 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 que también podría ser útil para permitir minúsculas para cosas como
Math.PI
. Si ese es el caso, sólo podría añadir el
else if
declaración siguiente en la función de reemplazo:
else if (Math.hasOwnProperty($0.toUpperCase())
return "Math."+$0.toUpperCase();
agregarlo entre la declaración if
y else
(example).
¿A menos que gane la suya no superará ningún problema de seguridad? – James