** Mathématiques à virgule flottante sécurisées pour les injections dans bash / shell **
Remarque: L'objectif de cette réponse est de fournir des idées pour une solution sécurisée par injection pour effectuer des mathématiques dans bash (ou d'autres shells). Bien sûr, la même chose peut être utilisée, avec des ajustements mineurs pour effectuer un traitement avancé des chaînes, etc.
La plupart des solutions présentées ont été construites à la volée, à l'aide de données externes (variables, fichiers, ligne de commande, variables d'environnement). L'entrée externe peut être utilisée pour injecter du code malveillant dans le moteur, beaucoup d'entre eux
Ci-dessous est une comparaison sur l'utilisation des différents langages pour effectuer des calculs mathématiques de base, où le résultat en virgule flottante. Il calcule A + B * 0,1 (en virgule flottante).
Toutes les solutions tentent d'éviter de créer des scriptlets dynamiques, qui sont extrêmement difficiles à maintenir. À la place, ils utilisent un programme statique et transmettent les paramètres à la variable désignée. Ils géreront en toute sécurité les paramètres avec des caractères spéciaux - réduisant ainsi la possibilité d'injection de code. L'exception est «BC» qui ne fournit pas de fonctionnalité d'entrée / sortie
L'exception est 'bc', qui ne fournit aucune entrée / sortie, toutes les données proviennent de programmes dans stdin, et toutes les sorties vont à stdout. Tous les calculs s'exécutent dans un sandbox, ce qui ne permet pas d'effet secondaire (ouverture de fichiers, etc.). En théorie, l'injection est sûre par conception!
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"