** Matematica in virgola mobile sicura per l'iniezione in bash / shell **
Nota: l'obiettivo di questa risposta è fornire idee per una soluzione sicura per l'iniezione per eseguire operazioni matematiche in bash (o altre shell). Naturalmente, lo stesso può essere utilizzato, con piccole modifiche per eseguire l'elaborazione avanzata delle corde, ecc.
La maggior parte delle soluzioni presentate, costruiscono al volo piccoli scriptlet, utilizzando dati esterni (variabili, file, riga di comando, variabili d'ambiente). L'input esterno può essere utilizzato per iniettare codice dannoso nel motore, molti dei quali
Di seguito è riportato un confronto sull'utilizzo dei vari linguaggi per eseguire calcoli matematici di base, dove il risultato è in virgola mobile. Calcola A + B * 0,1 (come virgola mobile).
Tutti i tentativi di soluzione evitano la creazione di scriptlet dinamici, che sono estremamente difficili da mantenere, utilizzano invece programmi statici e passano parametri nella variabile designata. Gestiranno in modo sicuro i parametri con caratteri speciali, riducendo la possibilità di iniezione di codice. L'eccezione è "BC" che non fornisce funzionalità di input / output
L'eccezione è "bc", che non fornisce alcun input / output, tutti i dati arrivano tramite programmi in stdin e tutto l'output va a stdout. Tutti i calcoli vengono eseguiti in una sandbox, che non consente effetti collaterali (apertura di file, ecc.). In teoria, iniezione sicura per progettazione!
A=5.2
B=4.3
awk -v A="$A" -v B="$B" 'BEGIN { print A + B * 0.1 ; exit 0}'
perl -e '($A,$B) = @ARGV ; print $A + $B * 0.1' "$A" "$B"
python -c 'import sys ; a = float(sys.argv[1]) ; b = float(sys.argv[2]) ; print a+b*0.1' "$A" "$B"
python3 -c 'import sys ; a = float(sys.argv[1]) ; b = float(sys.argv[2]) ; print(a+b*0.1)' "$A" "$B"
bc <<< "scale=1 ; $A + $B * 0.1"