2010-07-23 3 views
6

Ich möchte einschränken, welche PHP-Funktionalität meine Benutzer zugreifen können.Sandboxing Benutzer PHP Code

Zum Beispiel gibt es ein Objekt $data und der Benutzer mag iffor und echo zu verwenden.

Offensichtlich erlaubt es ihm, PHP zu schreiben, eine ernsthafte Schwachstelle.

Gibt es eine Möglichkeit, dieses PHP in einer Sandbox auszuführen oder würden Sie eine einfache PHP-Template-Engine empfehlen?

+0

Siehe: http: // stackoverflow.com/questions/324726/ist-dort-ein-weg-zu-ausführen-php-code-in-a-sandbox-von-innerhalb-php – troelskn

Antwort

8

Wenn Sie keinen eigenen Server haben, haben Sie wahrscheinlich kein runkit. Aber was Sie haben (wahrscheinlich) ist Tokenizer! Mit dem Tokenizer können Sie den angegebenen Quellcode durchsuchen und abbrechen, wenn Sie ein ungültiges Token finden. Here an example how to validate an array using this. Sie könnten dasselbe für Ihren Zweck tun. Die PHP-Dokumentation hat a list of tokens. Wenn Sie Hilfe benötigen, um zu entscheiden, welche Tokens erlaubt oder nicht erlaubt sind, sagen Sie es bitte.

€ dit: Und natürlich empfehle ich, auch Twig zu verwenden. Es ist so schön - und hat Sandboxing!

+0

Zweig hat Sandboxed Template-Code. Das ist nicht So gut wie Runkit-Sandbox, aber ich muss den PHP-Server nicht neu installieren. Vielen Dank! – jantimon

2

Versucht Smarty? http://www.smarty.net/

+2

Es gibt auch Dwoo: http://dwoo.org/ was mehr ist PHP5-ish – Macmade

+0

@Ghommey: Wenn Sie wirklich nur benutzerdefinierte Ausgabe wünschen, dann ist dies Ihre Wahl. Eine Template-Engine ist wesentlich einfacher zu pflegen als eine PHP-Sandbox. – Baju

1

Die PECL runkit extension tut Sandbox bieten, aber es ist vielleicht ein bisschen übertrieben für das, was Sie

4

Der einzige, den ich kenne bisher runkit ist tun wollen.

runkit Die Erweiterung sieht Mittel zur modifizieren Konstanten, benutzerdefinierte Funktionen, Klassen und benutzerdefiniert. Es bietet auch benutzerdefinierte superglobale Variablen und Embeddable Sub-Interpreter über Sandboxing.

Update:

ich diese beiden Links in Bezug auf zend finden konnten und runkit Sie auf einen Blick sollte:

http://framework.zend.com/wiki/display/ZFPROP/Zend_Http_Server+-+Mat+Scales
http://www.dunfy.me.uk/?p=38

+0

Runkit benötigt Thread-Sicherheit, um aktiviert zu werden und Zend erfordert, dass die Thread-Sicherheit deaktiviert wird. Gibt es eine Möglichkeit, Zend und Runkit zu benutzen? – jantimon

+0

'Die Runkit_Sandbox-Klasse ist nur ab PHP 5.1.0 oder speziell gepatchten Versionen von PHP 5.0 verfügbar und erfordert Thread-Sicherheit. ' In meinem' phpinfo() 'ist runkit aktiviert, runkit_sandbox ist aber wahrscheinlich deaktiviert Thread Sicherheit – jantimon

+0

@Ghommey: Das ist, was wir bisher haben :( – Sarfraz

4

Nach dem Vorbild von Smarty, geben twig ein Versuch!

Es gibt auch eine sehr robuste extension system, mit der Sie integrierte oder benutzerdefinierte Tags, Token Parser, Knoten, etc. in der Template-Sprache selbst erlauben/verbieten können. Auf diese Weise können Benutzer grundlegende Logik (bedingte Anweisungen, "Funktionen" (Blöcke) und Iteratoren) ohne Rückgriff auf die Übel von Eval haben.

+1

+1 für den Vorschlag Twig - es ist am besten! – NikiC

+0

Twig weht Smarty aus dem Wasser und es ist immer noch in der aktiven Entwicklung. –

1

PHP Fat-Free Framework verfügt über eine Template-Engine, die die Verwendung von PHP-Code verbietet und Ihnen ermöglicht zu definieren, welche Funktionen in HTML-Templates verwendet werden können.

Es gibt auch eine echte Sandbox-Funktion, die Funktionen und Dateien unabhängig von anderen macht, d. H. Variablen/Funktionen in einer Include-Datei sind anderen nicht bekannt, so dass Sie eine Funktion mit einem identischen Namen wie eine andere Include-Datei haben können. Dies kann für (dysfunktionale) Entwicklerteams von Nutzen sein.