Necesito recibir información del usuario de un poco de matemática, que quieren resolver. En lugar de analizar las entradas yo mismo, solo quiero usar lua, la función loadstring para cargar sus entradas y evaluarlas.
Pero no quiero dejar que ejecuten código abaritario, Así que paso la cadena a través de una lista blanca para asegurarme de que solo usen caracteres matemáticos.
function calc(inputEquationStr)
local startValid, endValid = string.find(inputEquationStr,"[%(%)%.%^%*%+%-/%d]+")
if startValid>1 or endValid<string.len(inputEquationStr) then
print("Error: Input doesn't look like math.")
else
local funcStr = "return " .. inputEquation
local mathFunction = loadstring(funcStr)
assert(mathFunction, "Syntax Error, in input")
print(mathFunction())
end
end
function calcOuter(inputStr)
local success, err = pcall(calc, inputStr)
if not success then
print("Error : " .. tostring(err))
end
end
Así que la parte importante, como lo veo, es que en la lista blanca solo se permiten +, -,., *, /, ^, () y dígitos.
Lo que se hace con string.find(inputEquationStr,"[%(%)%.%^%*%+%-/%d]+"
¿Esto será suficiente para proteger contra la inyección? ¿Hay algún tipo de camino, como cadenas codificadas en hexadecimal que debo vigilar?