** Безпечний для ін'єкцій математику з плаваючою точкою в bash / shell **
Примітка. Основна увага у цій відповіді - надання ідей для безпечного для ін'єкцій рішення для виконання математики в басі (або інших оболонках). Звичайно, те ж саме можна використовувати, з незначним регулюванням для виконання розширеної обробки рядків тощо.
Більшість рішень, які були представлені, конструюють невеликий сценарій на льоту, використовуючи зовнішні дані (змінні, файли, командний рядок, змінні середовища). Зовнішній вхід можна використовувати для введення зловмисного коду в двигун, багато з них
Нижче наводиться порівняння використання різних мов для виконання базових математичних обчислень, де результат у плаваючій крапці. Він обчислює A + B * 0,1 (як плаваюча точка).
Усі спроби рішення уникають створення динамічних сценаріїв, які дуже важко підтримувати, натомість вони використовують статичну програму та передають параметри у вказану змінну. Вони будуть безпечно обробляти параметри спеціальними символами - зменшуючи можливість введення коду. Виняток - "BC", який не забезпечує можливості введення / виводу
Виняток - "bc", який не забезпечує жодного вводу / виводу, всі дані надходять через програми в stdin, а весь вихід йде в stdout. Усі обчислення виконуються в пісочниці, що не дозволяє побічний ефект (відкриття файлів тощо). Теоретично, інжекційний безпечний дизайн!
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"