Ben (eval () veya call_user_func kullanmalı mıyım?)

6 Cevap php

Ben bir php proje üzerinde çalışıyorum, ve ben bir MySQL veritabanı zorlama var kod çalıştırmak istiyorum. Orada enjekte ediliyor güvensiz kod şansı var, bu yüzden endişeleniyorum tek şey verimlilik olduğunu. Ben bunun yerine çalışır () (o call_user_func yüzden doğrudan kod çalıştırabilir, ya da bunu ayrıştırmak) eval kullanmalı mıyım?

For example, if the code I fetched was "myfunc(1,2,3); anotherFunc(3,2,1);"
I can eval() it directly to run the code.

Ama call_user_func için (), ben koştum böylece dizeyi ayrıştırmak gerekiyor. Yani bu durumda kullanmak için daha iyi işlev hangisi?

6 Cevap

As a general rule, i always try to stay as far away from eval() as possible. This case, however, looks like a good candidate for it.

Sen "There's no chance of unsafe code being injected" söylüyorlar, bu yüzden büyük bir soru: kod veritabanında olmanın Mesaisiz bir şansı var mı?

Değilse, eval () çözümdür, ama varsa o zaman doğru ayrıştırma ve hata günlüğü / etc daha güvenli bir bahis olabilir. (I teoride daha hızlı) (call_user_func_array kullanılarak inanıyorum, bu yüzden herhangi bir ayrıştırma havai ihmal edilebilir hale gelebilir)

Veritabanında saklanması PHP başlı başına kötü bir tasarım koku; Bu durumda size güvensiz kod içerebilir asla oldukça emin olsa bile, bunu yapmak zorunda gibi varsayımların veya savunmaların sayısını en aza indirmek için her zaman iyidir. Eğer veritabanında PHP kodu saklamak, sonra bir saldırganın kazançlar veritabanına erişimi olan bir saldırı hızlı bir saldırganın rasgele kod çalıştırabilir hangi bir saldırı dönüşüyor, çok daha ciddi bir hale gelir! Ben veritabanı böyle tehlikeye sahip son derece olası olduğunu biliyorum, ama yine de bu bile bir olası durum, ihtiyacı daha da sistemi daha tehlikeye girmemesine iyi bir güvenlik uygulamasıdır.

Many people agree ki eval () her zaman, istisnasız, PHP kodu kaçınılmalıdır. Bir alternatif her zaman vardır.

Bu durumda, ancak, ben zaten bu yüzden () riskini artırmak için gitmiyor eval kullanarak, DB PHP kodu depolamak için eval () kullanarak, sizin için en iyi çözüm olacağını söylemek zorunda olacağını düşünüyorum daha fazla daha.

Ben, ancak, tavsiye ederim

  1. Eğer eval önce kodu doğrulamak için çalışın () bunu, sen izin ne muhafazakar kalarak. Nasılsa bir saldırganın veritabanına bile olası düşünce var olduğunu varsayın.
  2. En azından PHP kodu bir veritabanında saklanır değildir böylece uygulamayı yeniden bazı ciddi düşünmek. Karmaşık veri yapılarını saklamak durumunda, yerine JSON gibi bir şey ya da XML düşünüyorum. Güvenli ayrıştırıcılar bunlar için var.

Bu sorunun cevabı biraz gerici gibi görünüyor üzgünüm; Ben sadece bu tür şeylerin çok önemli olduğunu hissediyorum olur.

Ben ayrıştırma havai eklemek olacağını düşünürdüm, ama emin olabilirsiniz tek yolu testleri çalıştırmak için. Bunu çeşitli fonksiyonları ile hem yolları denemek ve sonuçları göreceğiz. Eğer saklamak için beklediğiniz temsil kodu kullanın.

İyi şanslar!

Eval () kullanın. Herhangi bir pozitif yan etkileri olmazdı - başka bir şey çabaya değmez.

Sen kod çalıştırılmasını etkileyen bir sanal php yürütebilirsiniz runkit uzantısı, bakmak isteyebilirsiniz.

Kodu çalışan kod etkisi varsayalım ise,) (eval için gidin.

Sen de bir try / catch bloğu çalıştırmak üzereyiz kodu kaydırmak gerektiğini durumda (eğer orada olmayacak dedi olsa bile, orada bir olasılık olduğunu ve en iyi uygulama), bir hata var