2009-07-23 16 views
2

Ich möchte Benutzer eine PHP-Klasse von mir testen lassen, die unter anderem Bilder zuschneidet und skaliert.Interpretieren Texteingabe als PHP

Ich möchte, dass sie PHP-Code in ein Textfeld schreiben, senden Sie das Formular, und dann wird ihr Code ausgeführt werden. Wie kann ich das machen?

Oder ist es andere sichere Möglichkeiten, Benutzer (irgendjemand) eine PHP-Klasse zu demozieren?

+1

Wenn Benutzer ihren PHP-Code ausführen, gibt es keine sicheren Möglichkeiten. – RaYell

Antwort

4

Ja. Sie können die eval-Anweisung in PHP (früher von John http://us2.php.net/manual/en/function.eval.php verbunden) verwenden, aber seien Sie sehr vorsichtig. Sie möchten nicht, dass Benutzer Code auf Ihrem Computer frei ausführen können.

Meine Empfehlung würde versuchen, mit einem anderen Ansatz zu kommen Demos zu tun - vielleicht ein flexibles paar Beispiele ... aber lassen Sie sie nicht direkt Code ausführen

+3

Ja, jeder sagt mit Eval() ist unheimlich. Würde sie das nicht tun lassen! Ich denke, ich mache ein paar Demos! –

1

Sie möglicherweise eval verwenden könnte http://us2.php.net/manual/en/function.eval.php

+1

Das würde funktionieren, ist aber sehr gefährlich. –

+3

Es ist nicht sehr gefährlich, es ist extrem gefährlich. –

+0

Es ist nur gefährlich, wenn Sie einige Vorsichtsmaßnahmen nicht treffen. –

5

Ich würde den PHP-Prozess Laichen ein Benutzerkonto mit fast keine Berechtigungen. Geben Sie den Lese-Schreib-Zugriff auf ein einzelnes Verzeichnis, aber das war's.

Sie öffnen sich immer noch für DoS-Angriffe mit Endlosschleifen und so, aber wenn Sie es unbedingt tun müssen, dann führen Sie den Code in dieser Sandbox mit sehr geringen Berechtigungen wie IE und Chrome aus.

Die Verwendung von EVAL ist wahrscheinlich die schlechteste Idee.

+0

Wenn Sie den nicht vertrauenswürdigen Code in einer VM ausführen, sind Endlosschleifen usw. kein Problem. –

3

Sie konnte die Funktion eval() verwenden, aber tun es nicht. Ernst.

Es gibt keinen "sicheren" Weg, um alten Benutzern zu erlauben, ihr eigenes PHP auf Ihrem Server laufen zu lassen. Du setzt dich einer potentiellen Welt der Verletzung aus.

Stattdessen bieten hervorragende Dokumentation, Codebeispiele und die Quelle für die eigene Demos und ermutigen potenzielle Nutzer es versuchen, auf ihren eigenen Test/Entwicklungsserver aus.

2

Wie es bereits erwähnt wurde, könnten Sie eval Funktion verwenden, aber es ist sehr gefährlich. Wenn Sie möchten, dass Benutzer den Code testen, bereiten Sie Demoseiten vor, die eine mögliche Verwendung darstellen, und z. B. die Möglichkeit, Parameter über HTML-Formulare per Benutzer hinzuzufügen.

0

Denken Sie nicht in Bezug auf PHP oder einer anderen für allgemeine Sprache, denken Sie an die minimal Sprache, die die Operationen in Ihrer Domäne der Bildverarbeitung zum Ausdruck bringen ausreichend ist. Benutzer senden Ausdrücke in dieser domänenspezifischen Sprache (DSL), diese Ausdrücke werden auf der Serverseite analysiert und an Ihren Code übergeben.

Zunächst ist es wichtig, über die Vielfalt der Bildverarbeitungsvorgänge nachzudenken und zu überlegen, wie sie kombiniert werden können. Das wird dir sagen, wie ausdrucksstark die Sprache sein muss. Sobald Sie das erledigt haben, gibt es viele Möglichkeiten, wie die Sprache syntaktisch aussehen würde. Die Syntax der Sprache könnte von einem Kompromiss zwischen Benutzerfreundlichkeit und einfacher Analyse abhängen.

Wenn Sie einen Parser für Ausdrücke dieser Art schreiben oder finden können, könnte dies für Benutzer am einfachsten sein. Kann jemand wirklich einen vorhandenen Ausdruck-Evaluator empfehlen, der in solchen Fällen funktionieren würde (z. B. kann Smarty sicher von Benutzern eingereichte Ausdrücke ausführen?) Oder tatsächlich ein Parser-Generator für PHP?

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

Eine Sprache wie this könnte für die Nutzer weniger einfach, aber es kann eine ziemlich einfache Stapelmaschine verarbeitet werden:

"foo.png" 90 rotate 50 resize 

Noch einfacher, eine XML-basierte Sprache dies nicht mag benötigen einen eigenen Parser:

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

einen DSL Verwendung schützt nicht SieFormal von domänenspezifischen Angriffen, zum Beispiel jemand über die Sprache verwenden, könnte ein Bild auf eine Zillion Pixel ein, um die Größe nd verbrauchen den gesamten Serverspeicher. Es müsste also eine Art Laufzeitumgebung für die DSL geben, die die Menge an Ressourcen limitiert, die von Benutzern eingereichte Skripte verwenden können.

0

Sie können eval verwenden, aber nicht ohne einige Vorsichtsmaßnahmen.

Wenn Ihre Sicherheitsbedenken sind nur „vorsichtig“ im Gegensatz zu „paranoid“, Sie haben ein paar Möglichkeiten:

  • Wenn Sie eine dedizierte Apache/PHP Instanz nur für dieses Projekt von Ihnen, gesetzt Aktivieren Sie die Option disable_functions in der Datei php.ini, und deaktivieren Sie alle Funktionen für Datei und Netzwerk. Dies betrifft die gesamte PHP-Installation und wird einige überraschende Dinge wie phpmyadmin unterbrechen.
  • Wenn Sie keinen dedizierten Server haben, versuchen Sie 'runkit': http://php.net/manual/en/book.runkit.php, um Funktionen nur innerhalb eines bereits laufenden Skripts zu deaktivieren.
  • Vielleicht mehr Arbeit? Richten Sie eine virtuelle Maschine (VirtualBox, VMware usw.) ein, die aggressiv vom Host-Betriebssystem aus mit minimaler Speicher- und Festplattenspeicherfreigabe firewallgesteuert wird, und führen Sie dort den nicht vertrauenswürdigen Code aus.

Wenn Sie paranoid sind ... richten Sie einen Genehmigungsprozess für alle hochgeladenen Code ein.

Verwandte Themen