CodeBlanks Logo Icon CodeBlanks

Güvenli değerlendirme

JavaScript kursu · Uzman · Ders 28/63

eval ve Function constructor'unun risklerini ve güvenli alternatifleri öğrenirsin.

eval ve new Function riski

eval ve new Function, kendilerine verilen dizeyi JavaScript kodu olarak çalıştırır. Kullanıcıdan gelen veriyi bu yollarla işlersen saldırgan istediği kodu çalıştırabilir.

Bu yüzden bu yapılar uygulamalarda neredeyse hiç kullanılmaz. Aynı risk setTimeout'a dize geçirildiğinde de doğar; bunun yerine her zaman bir fonksiyon verin.

Köşeli parantez güvenlidir

Bazen bir özelliğin adını çalışma anında bilirsin. Yanlış yol eval('obj.' + key) kullanmaktır. Doğru yol köşeli parantez gösterimidir: obj[key].

Köşeli parantez yalnızca bir özellik okur, kod çalıştırmaz. Anahtar kullanıcıdan gelse bile yalnızca veri erişimi olur; enjeksiyon mümkün değildir. Dinamik erişimde her zaman bu yolu tercih et.

Uygulama Güvenli değer erişimi

safeGetValue fonksiyonu yaz, parametre obj ve key. return obj[key] ile özelliğin değerini döndür.

Örnek çözümü göster
Önce fonksiyonu tanımla, sonra return obj[key] yaz.
Örnek çözüm:
function safeGetValue(obj, key) {
  return obj[key];
}

Kendini test et

  1. Hangisi dinamik özellik erişimi için güvenlidir?

    const obj = { a: 1, b: 2 };
    const key = getUserInput();
    // obj'nin özelliğine eriş
    • eval('obj.' + key)
    • new Function('return obj.' + key)()
    • setTimeout('obj.' + key, 0)
    • obj[key]
    Cevabı göster

    obj[key] — Doğru! obj[key] yalnızca bir özellik okur, kod çalıştırmaz.

  2. Köşeli parantezle erişimi tamamla

    const value = config[____];
    Cevabı göster
    const value = config[key];
  3. Erişim yöntemlerini eşleştir

    eval
    kod çalıştırır
    new Function
    kod üretir
    obj[key]
    özellik okur
    setTimeout(fn)
    zamanlar

Uzman bölümündeki tüm dersler