** Injektionssichere Gleitkomma-Mathematik in Bash / Shell **
Hinweis: Der Schwerpunkt dieser Antwort liegt auf der Bereitstellung von Ideen für eine injektionssichere Lösung für die Durchführung von Mathematik in Bash (oder anderen Shells). Dies kann natürlich mit geringfügigen Anpassungen verwendet werden, um eine erweiterte Zeichenfolgenverarbeitung usw. durchzuführen.
Die meisten der vorgestellten Lösungen erstellen ein kleines Scriptlet im laufenden Betrieb unter Verwendung externer Daten (Variablen, Dateien, Befehlszeile, Umgebungsvariablen). Die externe Eingabe kann verwendet werden, um schädlichen Code in die Engine einzufügen, viele davon
Nachfolgend finden Sie einen Vergleich zur Verwendung der verschiedenen Sprachen zur Durchführung grundlegender mathematischer Berechnungen, wobei das Ergebnis Gleitkommawerte sind. Es berechnet A + B * 0,1 (als Gleitkomma).
Bei allen Lösungsversuchen wird vermieden, dass dynamische Scriptlets erstellt werden, die extrem schwer zu warten sind. Stattdessen verwenden sie ein statisches Programm und übergeben Parameter an die angegebene Variable. Sie können sicher mit Parametern mit Sonderzeichen umgehen, wodurch die Möglichkeit der Code-Injection verringert wird. Die Ausnahme ist 'BC', das keine Eingabe- / Ausgabefunktion bietet
Die Ausnahme ist 'bc', das keine Eingabe / Ausgabe liefert, alle Daten kommen über Programme in stdin und alle Ausgaben gehen an stdout. Alle Berechnungen werden in einer Sandbox ausgeführt, die keine Nebenwirkungen zulässt (Öffnen von Dateien usw.). Theoretisch spritzwassergeschützt!
A=5.2
B=4.3
# Awk: Map variable into awk
# Exit 0 (or just exit) for success, non-zero for error.
#
awk -v A="$A" -v B="$B" 'BEGIN { print A + B * 0.1 ; exit 0}'
# Perl
perl -e '($A,$B) = @ARGV ; print $A + $B * 0.1' "$A" "$B"
# Python 2
python -c 'import sys ; a = float(sys.argv[1]) ; b = float(sys.argv[2]) ; print a+b*0.1' "$A" "$B"
# Python 3
python3 -c 'import sys ; a = float(sys.argv[1]) ; b = float(sys.argv[2]) ; print(a+b*0.1)' "$A" "$B"
# BC
bc <<< "scale=1 ; $A + $B * 0.1"