** Bash / kabukta enjeksiyon güvenli kayan nokta matematiği **
Not: Bu cevabın odak noktası, bash (veya diğer kabuklarda) matematik yapmak için enjeksiyon güvenli çözüm için fikirler sağlamaktır. Tabii ki, aynı, gelişmiş dize işleme, vb yapmak için küçük ayarlama ile kullanılabilir.
Sunulan çözümün çoğu, harici veriler (değişkenler, dosyalar, komut satırı, ortam değişkenleri) kullanarak anında küçük bir komut dosyası oluşturur. Harici giriş motora kötü amaçlı kod enjekte etmek için kullanılabilir, birçoğu
Aşağıda, temel matematik hesaplaması yapmak için çeşitli dili kullanma konusunda bir karşılaştırma bulunmaktadır; burada sonuç kayan noktadır. A + B * 0.1'i (kayan nokta olarak) hesaplar.
Tüm çözüm girişimleri, bakımı son derece zor olan dinamik komut dosyaları oluşturmaktan kaçınır, Bunun yerine statik programı kullanır ve parametreleri belirtilen değişkene geçirir. Özel karakterlerle parametreleri güvenli bir şekilde ele alırlar - kod enjeksiyon olasılığını azaltır. İstisna, giriş / çıkış olanağı sağlamayan 'BC' dir
İstisna, herhangi bir girdi / çıktı sağlamayan 'bc' dir, tüm veriler stdin'deki programlar aracılığıyla gelir ve tüm çıktılar stdout'a gider. Tüm hesaplama, yan etkiye izin vermeyen (dosyaları açma vb.) Bir sanal alanda yürütülür. Teoride, tasarım ile enjeksiyon güvenli!
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"