2010-08-15 27 views
5

örneğin, bir sonuç olarak dikkate alınmalıdır bazı değişkenleri saklayan bir dize var I: Ben eval eğer güvensiz olduğunu anlıyoruzeval() yerine ne kullanabilirim?

$foo = eval("return ".RUN_THIS.";"); 

: o zaman -uated eval()

define('RUN_THIS', '\$something.",".$somethingElse'); 

hangisi Değerlendirilen dize kullanıcı girişinden. Ancak, örneğin, herşeyi facebook'un HipHop'u çalıştırmaktan vazgeçtim, ki bu da bunu desteklemiyordu().

Görünüşe göre call_user_func() kullanabilirim - bu etkin olarak eval() ile aynı sonucu mu? eval() ne zaman güvenli olduğu nasıl kabul edilir, eğer durum böyleyse?

Düzeltme: Açıklamalara yanıt olarak, aslında amacın ne olduğunu açıkça belirlemedim. Sabit, daha sonra kodun, konfigürasyon sabitlerine erişimi olan bir sınıfın içinde olması veya prosedürel kodun, verilen değişkenler dizisini değerlendirmek için kullanabilmesi için önceden tanımlanır. Değerlendirilmesi gereken değişkenler duruma bağlı olarak değişebilir (tamamen farklı isimler, sıralama, biçimlendirme) fakat aynı amaçla aynı şekilde yürütülür, bu yüzden şu anda sabit olarak ayarlanmış değişkenler dizisine sahibim. yol. Teknik olarak, eval() sabitleri tanımlayan config.php olduğu sürece güvensiz değildir, ancak sorunun noktası bu değildi.

+9

Değişkenleri neden bu şekilde sakladığınızı açıklayabilirseniz yardımcı olur mu? – Cfreak

+2

Evet, bu biraz tasarım kusuru gibi geliyor. Kodda daha sonraki bir noktada ayrıştırılan daha soyut bir "RUN_THIS" (gerçek kod içermeyen) tanımlayamaz mısınız? –

+1

Yapamayacağınız bir neden var: '$ foo =" \ $ bir şey, $ bir şeyElse "; –

cevap

2

Kendall a simple solution var gibi görünüyor, ama ben diğer soruyu cevaplamak için çalışacağım:

Görünüşe kullanabileceğim call_user_func() - Bu etkili bir eval ile aynı sonuçtur()? Eğer durum() değilse, bu durum gerçekten güvenli ise nasıl kabul edilir?

call_user_funcaslında çünkü call_user_func yalnızca bir kullanıcı işlevini çağırabilirsiniz gerçeğinin daha güvenli eval olduğunu. Diğer yandan eval, dizeyi PHP kodunun kendisi olarak çalıştırır. Dizenin sonunda '; (dizgiyi kapatın ve yeni bir "satır" kodu) ekleyebilir ve daha fazla kod ekleyebilir, ;' ekleyebilir (kod satırını bitirebilir ve başka bir dize başlatamazsınız, böylece sözdizimi yoktur. hatası), böylece (bunun olmasına asla izin vb tüm önemli dosyaları silerek ve veritabanları için bilgiler alınırken dahil olmak üzere kullanıcı sunucu üzerinde çalışabilir PHP kod birçok içerecek şekilde sürekli RUN_THIS sağlıyor. doesn

call_user_funccall_user_func_array($func, $args)'u çalıştırdığınızda, kullanıcı aşağıdakileri kısıtlı bir şekilde çalıştırabilir: (a) işlevin kullanıcı tanımlı olması gerekir (b) $func'u kullanarak kullanıcının herhangi bir istediği işlevi kontrol ederek ister $func, "izin verilen işlevler" listesinde veya user_ gibi işlev adlarının ve $func değişkeninin kendisinin öneki gibi bir önek dizisi içerdiğinde (Bu şekilde kullanıcı yalnızca user_ ile başlayan işlevleri çalıştırabilir.

+1

' exec'! = 'Eval' –

+0

Biliyorum. Bir şeyi kaçırmadıkça, aslında 'eval' değil, 'exec' den bahsediyorum. – Umang

+0

Gönderinizi tekrar okuyun, "' call_user_func' aslında ** '' exec' ** 'den daha güvenlidir. –

1

Neden çift tırnaklı dize oluşturma kullanamazsınız hiçbir neden göremiyorum.

$foo = "\$something,$somethingElse";