SORU
13 EKİM 2008, PAZARTESİ


Ne zaman JavaScript'in eval() kötü değil mi?

Bazı JavaScript kullanıcı tarafından girilen ayrıştırmak için yazıyorum fonksiyonları (elektronik tablo gibi işlevleri). Sahip formülü ayrıştırılırolabilirJavaScript dönüştürmek ve eval() üzerinde sonuç vermeye çalışacak. Ancak, ben hep yüzleşmekten kaçınıyor kullanarak eval() mümkünse hayır, çünkü kötü, doğru ya da yanlış, ben her zaman düşündüm bu daha da kötü, çünkü JavaScript kodu için değerlendirir olabilir değiştirilmiştir kullanıcı).

Belli ki bir eval() ayrıştırma JSON (sanırım bu JS kütüphanelerin kullanımı eval() için bu bir yerde bile, çalışan JSON ile bir düzenli kontrol önce), ama ne zaman başkaJSON işlenirken dışındaeval()? kullanmak için OK

. ben^>Birkaç kişi şimdi de belirttiği gibi, hatta gerekli eval() JSON ayrıştırmak için kullanmak için değil. Ne zaman kullanmak için TAMAM mı?

CEVAP
13 EKİM 2008, PAZARTESİ


Sorunuzun öncül adres için bir dakikanızı almak istiyorum - eval ()"kötü". ". Kelime ^em>kötü"programlama dili insanların kullandığı gibi, genellikle "anlamına gelir", daha doğrusu "basit bir komut ile zarar bir sürü neden mümkün". tehlikeli Ne zaman tehlikeli bir şey kullanmak için TAMAM mı? Tehlikenin ne olduğunu ve gerekli önlemleri alarak, sen bilirsin.

Nokta, hadi eval kullanımı tehlikeleri bakmak için(). Muhtemelen diğer her şey, ama iki büyük riskler gibi birçok küçük gizli tehlikeler var - neden eval() kötü olarak kabul edilir - performans ve kod enjeksiyon.

  • Performans eval() yorumlayıcı, derleyici/çalışır. Eğer kodunuzun derlenmiş ise, o zaman bu, çalıştırma ortasında muhtemelen ağır bir derleyici aramak gerekir, çünkü büyük bir hit olur. Ancak, JavaScript eval arama anlamına gelir hala çok yorumlanan bir dildir, () büyük bir performans genel durumda (ama aşağıda benim belirli açıklamalar) çarptı.
  • Kod enjeksiyon - eval() potansiyel olarak çalışır yükseltilmiş ayrıcalıklar altında kod dizisi. Örneğin, bir programı yönetici olarak çalışan/root hiç eval etmek isterim() giriş "/etc-rf/önemli-dosya" ya da daha kötüsü. rm olabilir çünkü potansiyel giriş kullanıcı, Yine, bir tarayıcıda JavaScript program kullanıcının kendi hesabı zaten çalıştığı için böyle bir sorun yok. Sunucu tarafı JavaScript sorunu olabilir.

Özel bir durum için. Anladığım kadarıyla, sen üreten dizeleri öyle varsayıyorsun dikkatli değil izin bir dize gibi "rm -rf bir şey-önemli" için oluşturulabilir, yok kod enjeksiyon riski (ama lütfen unutmaçok çok zorgenel durum) bunu sağlamak için. Eğer tarayıcı kullanıyorsanız da, sonra kod enjeksiyon çok küçük bir risk olduğunu düşünüyorum.

Performans olarak, kodlama kolaylığı karşı ağırlık gerekecek. Eğer formül ayrıştırma iseniz, ayrıştırma sırasında sonucu hesaplamak yerine başka bir ayrıştırıcı çalıştırabilirsiniz benim görüşüm şudur ki (eval içindeki()). Ama kodu daha kolay eval kullanarak olabilir(), ve performans isabet muhtemelen fark edilmeyecektir. Eval gibi görünüyor() bu durumda muhtemelen size zaman kazandırabilir başka bir işlevi daha kötü.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • KendrickLamarVEVO

    KendrickLama

    9 ŞUBAT 2011
  • PlugResearch

    PlugResearch

    22 Mart 2006
  • Skrillex

    Skrillex

    6 NİSAN 2010