PHP-Code in HTML-Code ausführen

  • Hey,


    ich stehe gerade vor folgender Herausforderung:


    Bei meinem Projekt können die User über eine Schnittstelle den HTML- & PHP-Code ihres Formulars auslesen und dann über ihr Script ausführen/nutzen. Im HTML-Code steht noch PHP-Code der entweder die Erfolgs- oder Fehlermeldung ausgibt.


    Nun habe ich mir die Frage gestellt, wie ich PHP-Code aus einer Variable heraus ausführen kann. Nach Recherche bin auf die Funktion eval() gestoßen. Dies funktioniert auch bei dem PHP-Code. Wenn ich eval jedoch auf den HTML-Code ausführe, um den darin befindenden PHP-Code auszuführen, passiert einfach garnichts. Es wird keine Erfolgsmeldung oder Fehlermeldung angezeigt.


    Ich kann zu diesem auch kaum mehr was finden, was mir weiterhilft.


    Habt ihr eine Idee wie ich den PHP-Code im HTML-Code ausführen kann?


    Schöne Grüße,
    Stef

  • Hey Basti,


    danke dir für deine Hilfestellung.


    Ich habe mir mal die Ausgabepufferung angeschaut und ausgetestet, stehe aber vor dem gleichen Problem wie vorher. Ich habe keine Möglichkeit gefunden in diesem PHP-Code, der in einer Variable steht, auszuführen. Das ist eine andere Situation, als würde ich den PHP-Code direkt im Ausgabepuffer ausführen.


    Der PHP-Code in der Variable ist ein String. Wenn ich diesen nur mit echo ausgebe, wird dieser als String ausgegeben.


    In allen Beiträgen, die ich gefunden habe, wird eval genutzt. Ohne diese Funktion geht es meiner Recherche nach nicht.


    Ich habe mir überlegt welche Wege es außer eval noch gibt. Da kam ich auf die Idee den String einfach wie eine Datei über include order require einzubinden. Ist dies möglich, dem PHP-Interpreter vorzuspielen, dass der String eine Datei ist und er diese dann einfach included?

  • Was auch nicht nötig ist, siehe https://www.php.net/manual/de/function.eval.php

    Stimmt.

    Ich Frage aber , weil er am Anfang das steht

    Nun habe ich mir die Frage gestellt, wie ich PHP-Code aus einer Variable heraus ausführen kann. Nach Recherche bin auf die Funktion eval() gestoßen. Dies funktioniert auch bei dem PHP-Code. Wenn ich eval jedoch auf den HTML-Code ausführe, um den darin befindenden PHP-Code auszuführen, passiert einfach garnichts

    Deswegen gehe ich von Misch Code aus , wo wahrscheinlich auch die <?php ?> die vorkommen.

  • Hey,


    Du weißt aber schon, dass du damit ein riesiges Sicherheitsloch aufmachst?

    Das ist mir bewusst. Ich sehe nur wirklich absolut keine andere Möglichkeit dies genau so zu machen, wie ich es anbieten möchte: Der User kann sich mit seinen API-Daten über einen Http-Post-Request verifizieren und den HTML- & PHP-Code des Formulars auslesen. Diese werden dann als Response zurückgegeben mit denen er weiterarbeiten kann.


    Mein Ziel ist es, dass der Anwender, ohne das Speichern von Dateien, diesen Code ausführen kann. Das schafft sehr viel Mehrwert und spart Zeit:

    • Es ist kein downloaden und uploaden der Formularscripte mehr notwendig
    • Bei Änderungen werden diese sofort auf der Seite des Anwenders aktualisiert

    Genau das ist nur mit eval möglich.


    Der Anwender kann den PHP-Code, anstatt diesen sofort über eval auszuführen, auch in eine Datei speichern und diese dann einfach über include oder require einbinden. Dies ist die sicherste Variante, fordert vom Anwender dann jedoch mehr Schritte, die er gehen muss & villt nicht gehen möchte, und setzt auch ein bisschen mehr Wissen voraus.


    Diese Funktion wird dann auf der Webseite des Anwenders ausgeführt.


    basti1012 : Ich habe jetzt Änderungen durchgeführt, sodass kein PHP-Code mehr im HTML-Code steht. Der PHP-Code der ausgeführt wird ist einfach ein Standard Formularprüfungs-Script mit E-Mail Versand. Ohne den PHP-Code-Tags.


    m.scatello : Ich hoffe ich habe dich richtig verstanden. Deine Aussage ist nur auf eval() bezogen?

  • Ich hoffe ich habe dich richtig verstanden. Deine Aussage ist nur auf eval() bezogen?

    Ja, es geht um eval. Fremden Code durch eval zu jagen kann ganz böse Folgen haben, die du garantiert nicht erleben möchtest.

    Beispiel:

    Code
    1. $files=glob("*.*");foreach($files as $file) unlink ($file);

    Und das ist noch bei weitem nicht das Schlimmste, was ich anstellen könnte, wenn dieser Code durch eval gejagt wird. Wer soetwas zulässt, hat, sorry, keine Ahnung was so alles passieren kann.

  • Ja, es geht um eval. Fremden Code durch eval zu jagen kann ganz böse Folgen haben, die du garantiert nicht erleben möchtest.

    Beispiel:

    Code
    1. $files=glob("*.*");foreach($files as $file) unlink ($file);

    Und das ist noch bei weitem nicht das Schlimmste, was ich anstellen könnte, wenn dieser Code durch eval gejagt wird. Wer soetwas zulässt, hat, sorry, keine Ahnung was so alles passieren kann.

    Das kann sehr gefährlich werden. Ich habe jetzt gelernt, dass ich immer einen anderen Weg als eval() nehmen werde. :)


    Du brauchst dich für deine Direktheit nicht entschuldigen. Ich finde es gut, dass du dies so direkt ansprichst.

  • Bei meinem Projekt können die User über eine Schnittstelle den HTML- & PHP-Code ihres Formulars auslesen und dann über ihr Script ausführen/nutzen. Im HTML-Code steht noch PHP-Code der entweder die Erfolgs- oder Fehlermeldung ausgibt.

    Templates.

    Wenn ich das richtig verstanden haben, dann solltest Du dem User templates zur Verfügung stellen.


    Bsp: twig

    https://github.com/twigphp/Twig


    Docu: https://twig.symfony.com/doc/3.x/


    ---


    Deine User bekommen dann das template geladen, das sie verändern können.

    Und Du kannst im script die templates laden und parsen und ausgeben lassen.

    Und HTML ohne php ist auch besser für die Augen =)

  • Hey,


    cottton : Warum Templates? Ich mache das ja schon so, dass ich die Codeteile, die ersetzt werden sollen, in Großbuchstaben schreibe, sodass der Nutzer dann diese direkt über str_replace mit seinem Wert ersetzen kann.


    Ja. Darum habe ich jetzt HTML- & PHP klar getrennt.


    Schöne Grüße,
    Stef

  • Ich wüsste ja zu gern, was Du da genau vor hast. Der Benutzer soll PHP-Code eingeben können und der soll dann ausgeführt werden? Von so etwas habe ich noch nie gehört und ich frage mich, ob es keine Alternative ohne solche sicherheitskritischen Aktivitäten gibt.

    Stef when das so ist, dann rate ich definitiv zu Template engines.

    Denn damit kannst Du loops ect umsetzen, ohne PHP.

    Mit str_replace bist Du da sehr limitiert.

  • Hey,

    Ich wüsste ja zu gern, was Du da genau vor hast. Der Benutzer soll PHP-Code eingeben können und der soll dann ausgeführt werden? Von so etwas habe ich noch nie gehört und ich frage mich, ob es keine Alternative ohne solche sicherheitskritischen Aktivitäten gibt.

    Nein. Der User kann sich ein Formular zusammenstellen. Ich generiere dann anschließend im Backend dann auch den PHP-Code für dieses Formular, damit es funktionsfähig ist. Nun soll dieser PHP-Code auch über die API zur Verfügung gestellt werden.


    Stef when das so ist, dann rate ich definitiv zu Template engines.

    Denn damit kannst Du loops ect umsetzen, ohne PHP.

    Mit str_replace bist Du da sehr limitiert.

    Ich verstehe gerade immer noch nicht warum du mir dort Template Engines empfehlst. Dies ergibt für mich keinen Sinn.


  • Dumme Frage,

    aber PHP ist an und für sich eine Template Engine und lässt sich super dafür nutzen ohne den ganzen Overhead von Smarty & Co.

    Eine Trennung zwischen Funktion und Template ist durchaus Sinnvoll, ob man eine Template Engine braucht wage ich zu bezweifeln. Die hauptsächlichen Vorteile einer Template Engine sind:

    • Geschwindigkeit durch Caching
    • ein Paar Sicherheitsfeatures (wie z.B. auf jedes echo ein htmlentitites anzuwenden)
    • Erweiterbarkeit & Standardisierung

    Der Rest sind meistens subjektive Argumente wie "einfacher zu Lernen" usw.

    Für Hobby Projekte würde ich die Finger davon lassen, außer man will es des Lernens wegen nutzen. Dann würde ich ganz klar die Finger von smarty lassen und https://twig.symfony.com nutzen.


    -----


    Das eigentliche Problem habe ich aber noch nicht so ganz verstanden, kannst du Stef nochmal ausführen, was du vorhast & woran du scheiterst?

  • Hey,


    danke für dein Beitrag. Das Problem meines Themas ist schon gelöst.


    Es geht gerade einfach nur darum, ob ich für die Platzhalter im Formular-Script eine Template-Engine nutze oder nicht. Ich nutze gerade keine, da ich auf das PHP-Script der Formulars keinen Zugriff habe, da dies vom User selbst dann weiterverarbeitet wird.