Ho bisogno di prendere input dall'utente di un semplice pezzo di matematica, che vogliono risolvere. Anziché analizzare personalmente l'input, voglio solo usare la funzione lua, loadstring per caricare il loro input e valutarlo.
Ma non voglio lasciarli eseguire codice abominevole, Quindi sto passando la stringa attraverso una whitelist per assicurarmi che stiano usando solo caratteri matematici.
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
Quindi la parte importante, come la vedo io, è che autorizzo a consentire solo +, -,., *, /, ^, () e cifre.
Che è fatto con string.find(inputEquationStr,"[%(%)%.%^%*%+%-/%d]+"
Sarà sufficiente proteggere dall'iniezione? C'è qualche modo, come stringhe con codifica esadecimale che devo fare attenzione?