Perl'de eval yapısının iki sözdizimi vardır:
Hata işleme özellikleri:
$@ hata metnini içerir (eğer hata varsa), aksi takdirde $@ boştur.eval BLOCK daha hızlı, daha güvenli ve dinamik kod yürütülmesi gerekmiyorsa tercih edilir.eval STRING dinamik kod oluşturmak için uygundur, ancak dizeyi ek bir şekilde derler, bu da daha yavaştır ve potansiyel olarak daha tehlikelidir.# eval BLOCK kullanımına örnek my $result = eval { die "Hata!" değilse 1 + 1 == 2; return "Tamam"; }; if ($@) { warn "Yakalınan hata: $@"; } # eval STRING kullanımına örnek my $code = '$x = 1 + 2; $x;'; my $res = eval $code; if ($@) { warn "Eval dize hatası: $@"; }
Eğer eval STR içine yeterince düzgün kaçış yapılmadan dinamik olarak yerleştirilen değişkenler konursa, ek riskler doğabilir mi?
Evet, eğer yerleştirilen dize dışarıdan (örneğin, kullanıcı girdisinden) elde edilen değişkenlerden oluşturuluyorsa, güvenlik/injection tehdidi ortaya çıkar. Her zaman kaçış kullanmak veya dış veriler için eval STRING kullanmamak gerekir.
my $user_code = 'system("rm -rf /");'; eval $user_code; # ÇOK TEHLİKELİ!
Hikaye
Sanal makinelerin parametrelerini kontrol etmek için denetim skriptinde kullanılan eval STRING, "yanlışlıkla" dış konfigürasyon dosyasından okunan verileri içermekteydi. Bir gün dosya değiştirilince, saldırganın kodunu yürütmeye neden oldu ve sunucu tehlikeye girdi.
Hikaye
Bir geliştirici, potansiyel olarak çökmesine neden olacak kod bölümünü eval BLOCK içine sardı, zamanında yalnızca runtime hatalarını değil, derleme zamanı hatalarını da yakalayacağını düşündü (örneğin, sözdizimsel hatalar). Ancak bir sözdizim hatası (örneğin, değişken adında bir yazım hatası) eval BLOCK tarafından yakalanmadı ve sürecin çökmesine neden oldu.
Hikaye
Dumper dump'tan sonra eval STRING ile karmaşık veri yapılarının serileştirilmesi sırasında, dizeye yalnızca geçerli Perl kodunun dahil edildiğinden emin olmayı unuttular - bir kullanıcı input injection ile yürütülebilir kod ekledi, bu da sunucuda kötü niyetli komutların çalıştırılmasına yol açtı.