PHP gibi metin girişini yorumlamak

7 Cevap php

Kullanıcıların başka şeyler bitkileri arasında ve görüntüleri yeniden boyutlandırır, benim bir PHP sınıfını test izin vermek istiyorum.

Ben onlara bir metin alanında PHP kod yazmak formu göndermek ve daha sonra kendi kod çalıştırmak olacaktır istiyorum. Bunu nasıl yapabilirim?

Ya da kullanıcılar (kimse) bir PHP sınıfı demo izin vermek diğer güvenli yolu nedir?

7 Cevap

Evet. Sen (John tarafından daha önce bağlanmış http://us2.php.net/manual/en/function.eval.php) php eval deyimi, ancak çok dikkatli olun kullanabilirsiniz. Eğer gerçekten kullanıcılar özgürce makinede kod çalıştırmak mümkün istemiyorum.

Benim tavsiye demolar yapmak için farklı bir yaklaşım ile gelip denemek istiyorum - belki de bir esnek birkaç örnek ... ama bunları doğrudan kod çalıştırmasına izin vermeyin

Ben gelecek için-hiçbir izinlerine sahip bir kullanıcı hesabı kullanarak PHP işlem spawn olacaktır. Tek bir dizine okuma-yazma erişimi vermek, ama o kadar.

Hala sonsuz döngü ve bu ile DoS saldırıları kendinizi açılış, ama kesinlikle bunu yapmak gerekir eğer IE ve Chrome yapmak gibi, o zaman bu çok düşük izinleri sandbox kodunu çalıştırmak ediyoruz.

EVAL kullanarak muhtemelen kötü bir fikirdir.

Sen could eval () işlevini kullandığınızda, ancak don't do it. Cidden.

Herhangi bir eski kullanıcı sunucu üzerinde kendi PHP çalıştırmak izin yok "güvenli" bir yolu var. Sen zarar bir potansiyel dünyasına kendinizi teşhir edilir.

Bunun yerine, mükemmel belgelerine, kod örnekleri ve kendi demolar için kaynak sağlamak, ve kendi test / geliştirme sunucuları üzerinde denemek potansiyel kullanıcılarını teşvik ediyoruz.

Zaten belirtildiği gibi, eval function kullanabilirsiniz, ama çok tehlikeli. Kullanıcıların, kodu test olası kullanımını sunan demo sayfaları hazırlamak ve örnek olasılığı için HTML formları aracılığıyla kullanıcı tarafından parametreler eklemek istiyorum.

Muhtemelen eval kullanabilirsiniz http://us2.php.net/manual/en/function.eval.php

Görüntü işleme alanınızdaki işlemleri ifade etmek yeterli oluyor minimal dil düşünüyorum, PHP veya başka bir genel amaçlı dil açısından düşünmeyin. Kullanıcılar bu alanı özgü dil (DSL) ifadeleri göndermek, bu ifadeler sunucu tarafında ayrıştırıldı ve kod geçirilir.

Önemli şey, başlangıçta görüntü işleme operasyonlarının aralığında ve nasıl kombine edilebilir düşünmektir. Bu dil olması için ne ifade söyleyecektir. Eğer dışarı çalıştıktan sonra, dil sözdizimsel nasıl görüneceğini için bol seçenek vardır. Dilin sözdizimi, kullanım kolaylığı ve ayrıştırma kolaylığı arasında bir değiş tokuş bağlı olabilir.

Bu tür ifadeler için bir ayrıştırıcı yazmak ya da bulabilirsiniz, kullanıcılar için kolay olabilir. Aslında, herkes bu gibi durumlarda çalışacak varolan bir ifade değerlendirici (örneğin, Smarty güvenle kullanıcı gönderilen ifadeleri çalıştırabilirsiniz?), Ya da gerçekten PHP için bir ayrıştırıcı jeneratör tavsiye edebilir?

resize(rotate("foo.png", 90), 50)

: this kullanıcılar için daha az kolay olabilir, ama bu oldukça basit bir yığın makine kullanılarak işlenebilir gibi bir dil

"foo.png" 90 rotate 50 resize

Daha kolay, böyle bir XML tabanlı dil kendi ayrıştırıcı gerekmez:

<resize percent="50"><rotate degrees="90"><img src="foo.png"></rotate></resize>

Örneğin birisi bir zillion piksel bir görüntüyü yeniden boyutlandırmak ve tüm sunucu belleği kullanmak için yukarıdaki dili kullanabilir için DSL kullanıyorsanız, etki alanına özgü saldırılardan korumak değil. Yani herhangi bir kullanıcı tarafından gönderilen komut kullanabilirsiniz kaynakların miktarına sınırlar koyar DSL için çalışma zamanı ortamı bir çeşit olması gerekir.

Sen eval kullanmak, ancak bazı önlemler olmadan yapabilirsiniz.

Güvenlik kaygıları "paranoyak" karşıt olarak sadece "temkinli" ise, birkaç seçeneğiniz var:

  • Sadece senin bu proje için özel bir Apache / PHP örneği varsa, php.ini içindeki disable_functions seçeneği ayarlamak ve tüm dosya ve ağ ile ilgili işlevlerini kapatın. Bu tüm PHP kurulumu etkileyecek ve phpmyadmin gibi bazı şaşırtıcı şeyler, kıracak.
  • Eğer özel bir sunucu yoksa, 'runkit' deneyin: http://php.net/manual/en/book.runkit.php, sadece zaten çalışan bir komut dosyası içindeki işlevleri devre dışı bırakmak için.
  • Belki de daha fazla çalışır? Kurulum agresif bellek ve disk alanına minimal tahsisi ile, Sunucu İşletim içinde güvenlik duvarı, ve orada güvenilmeyen kodu çalıştırmak bir sanal makine (VirtualBox, VMware, vb.)

Tüm yüklenen kod için bir onay süreci paranoyak ... kurulum iseniz.