PHP sandbox / sterilize create_function geçti kod

8 Cevap php

Ben sunucu sonunda bazı kullanıcı kodu çalıştırmak için create_function kullanıyorum. Ben bu ikisinin herhangi arıyorum:

  1. Yürütme zararlı bir şey önlemek için kendisine geçirilen kod sterilize bir yolu var mı?
  2. Alternatif olarak, kullanıcı başka bir şey etrafında çalamaz böylece sanal alanlı bir ortamda çalıştırmak için bu kodu belirtmek için bir yol var.

Teşekkürler!

8 Cevap

Sen kod ne yapacağını anlamaya tonkenizer kullanabilirsiniz, daha sonra beyaz liste belirli işlevleri ve işlemleri. Ben özellikle PHP'nin esnekliği göz önüne alındığında, bu kusursuz yapmak çok zor (veya imkansız) olma sona ereceğini düşünüyorum:

$f = "shell_exec";
$arg = 'rm -rf /';

$f($arg); // ouch
call_user_func($f, $arg); // ouch
eval("$f('$arg');"); // ouch

$newF = create_user_function('', "$f('$arg');");
$newF(); // ouch

Size% 100 güvenlik (iyi,% 99.9 ...) verecek Sandbox tek tür, sadece sonradan atmak bir sanal makinedir.

Sen güvenilir kullanıcı girdileri olamaz - kararlı bir hacker sanitization kodunuzu aşmak için bazı karanlık yol bulacaktır.

Sandboxing mümkün olabilir, ama aynı derecede sakatlayıcı olduğunu olabilir. Eğer gerçekten güvende olmak istiyorsanız, her arama için bir sandbox oluşturmak gerekir. Sonuçta, birisi sanal diğer tüm kullanıcılar için zararlı olan sahte kod yürütebilir.

Ben gerçekten buna izin istiyorum sanmıyorum. Şöyle düşünün: Eğer sunucuya programlı erişim sağlıyor!

Eğer güvenli korumalı alan PHP ortamı oluşturmak, Quercus, Java tabanlı PHP yorumlayıcısı kullanarak deneyebilirsiniz. Sen Rhino kullanarak JavaScript için aynı şeyi yapabilirsiniz, bu yüzden Quercus ile mümkün olabileceğini düşünüyorum.

Biz bazı şeyler için zamanı denetimleri gerçekleştirmek için statik kod analiz dizgeciklerini kullanmak, hem de kodunu değiştirmek. Bu simgeleştiricisine dayalı simgeleştiricisine ve komut ile yapılır. Tokenizer aynı bir PHP aslında kullandığı olduğundan, kendi üzerine yazmaktan şansınızı artırır.

Ben bir dili analiz etmeye Regexes kullanarak insanları gördüm. Bu gerçekten kötü bir fikir.

Ama ...

PHP oldukça aptal kolay dilbilgisi, ve simgeleştiricisine erişimi beri, aslında değişken işlevler izin vermeme kötülüklerden en durdurmak ve sadece beyaz listeye fonksiyonları küçük bir sayı denir imkân sağlar. Hatta daha iyi, OOP ihtiyacınız yoksa.

Ancak, biz sorunların% 100 çivilenmiş olduğunu yeterince emin hissetmiyorum, ve biz bir klavye ile gezegeni üzerindeki her kullanıcı, müşterilerin ödeme değil backend kullanıcıları için bir sanal güç için kullanabilir ve belki de kötülük.

Ben "kötü uygulamalar" olarak fikir% 100-kaka kaka burada insanlar bir ipucu almak gerekir düşünüyorum da. Bunu yapmak için nedenleri vardır.

Eğer kullanıcılar yararlanabilirler özel bir (laşmış) dil oluşturma düşünebiliriz. Sonra çok iyi PHP'nin fonksiyonları sadece sarma olabilir desteklenen fonksiyonların kütüphane oluşturmak için size kalmış. Ama o zaman bile, bu hack-proof veya çalışma yapmak sıkıcı bir iş en iyisidir. Kullanıcıların ilk etapta kod erişimi olmasını istediğiniz Belki neden yeniden değerlendirmek gerekir? Eğer (ile görüşmek veya sorunuzu güncellemek için birine ihtiyacınız varsa ben yardım etmek isterdim, sanırım? :)

Bunu halledebiliriz umut!

-Dave

Genel olarak kötü bir fikir ve çok tehlikeli IMO olursa olsun, yerine ne koymak korumaları. Iyi kullanıcılar yapmak için izin tam olarak ne ile sınırlı bir sözde-dili oluşturmak.

Yardımcı olabilir GitHub bir sınıf, erken aşamalarında ama umut verici görünüyor.

https://github.com/fregster/PHPSandbox