** Matemáticas de punto flotante a prueba de inyecciones en bash / shell **
Nota: El enfoque de esta respuesta es proporcionar ideas para una solución segura para la inyección para realizar las matemáticas en bash (u otros shells). Por supuesto, se puede usar lo mismo, con pequeños ajustes para realizar un procesamiento avanzado de cadenas, etc.
La mayoría de las soluciones que se presentaron, construyen pequeños scriptlet sobre la marcha, utilizando datos externos (variables, archivos, línea de comando, variables de entorno). La entrada externa se puede usar para inyectar código malicioso en el motor, muchos de ellos
A continuación se muestra una comparación sobre el uso de varios idiomas para realizar cálculos matemáticos básicos, donde el resultado es punto flotante. Calcula A + B * 0.1 (como punto flotante).
Todos los intentos de solución evitan crear scriptlets dinámicos, que son extremadamente difíciles de mantener. En su lugar, usan un programa estático y pasan los parámetros a la variable designada. Manejarán con seguridad los parámetros con caracteres especiales, reduciendo la posibilidad de inyección de código. La excepción es 'BC' que no proporciona facilidad de entrada / salida
La excepción es 'bc', que no proporciona ninguna entrada / salida, todos los datos provienen de programas en stdin y toda la salida va a stdout. Todos los cálculos se ejecutan en un entorno limitado, que no permite efectos secundarios (abrir archivos, etc.). En teoría, la inyección es segura por diseño.
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"