Mozz: und PHP <- geht das überhaupt?

Beitrag lesen

Aloha!

:-) Ole!!

Hi Sven!

Erst mal muss ich ein bisschen schleimen: Du bist einfach der Beste!! Auf die Idee das Perl-Script in PHP einzubinden bin ich gerade gar nicht gekommen, sondern bin nur von Perl ausgeganen. Warum steht man manchmal so auf dem Schlauch, kann mir das jemand mal sagen??!

Du hast vielfältige Möglichkeiten:

  1. Include per URL:
    include("http://www.example.com/cgi-bin/perlscript.pl?parameterstring-urlencoded");

Diese Möglichkeit ist die schlechteste von allen. Dein PHP-Script muß einen kompletten HTTP-Request absetzen und das Ergebnis empfangen. Das dauert. Dafür kannst du das Perl-Script PHP-Code ausgeben lassen, der dann ausgeführt wird.

Sachen gibt's, ein Perl-Script, das PHP-Code erzeugt, da muss man erst mal drauf kommen... ;-) Ist aber (bei mir) nicht nötig. Ich habe ein Suchmaschinenanfrage an ein Perl-Script, das HTML-Code erzeugt, der nur ausgegeben werden muss.

Allerdings Vorsicht: Erstens passe höllisch auf, wenn die Include-Adresse variabel gelassen wird (wenn von extern ein Angreifer eine anderere URL mit einem bösen PHP-Script einschleusen kann, hast du verloren!), und zweitens funktioniert das nur, wenn die fopen-url-wrappers-Option aktiv ist (und die kann, um genau diesen Angriff auszuschließen, deaktiviert sein).

Die Include-Adresse selbst wäre statisch: http://www.example.com/cgi-bin/perlscript.pl?var=suchanfrage&var2=weitere_Optionen&... nur die Parameter nicht. Das Perl-Scrip ist auch auf dem gleichen Rechner (wenn das für die fopen-url-wrappers-Option von Belang wäre). Habe es auch gerade mal getestet und es funktioniert auch prima!! Geht aber wirklich nur mit http://www.example.com/cgi-bin/... (http am Anfang, da mit der alleinigen Datei das Perl-Script ../cgi-bin/usw. nicht abgearbeitet wird, sondern nur der Code ausgegeben wird. Btw. PHP kennt das http-Stammverzeichnist / nicht, da es ja auf Dateiebene werkelt, oder?

  1. Aufrufen eines externen Systemkommandos:
    Dazu kennt PHP die Kommandos passthru(), popen() und den Backtick-Operator. exec() und system() sind eher ungeeignet, um Massenoutput durchzureichen.

2a: Im Prinzip könntest du auf diese Weise an einer bestimmten Stelle den Output eines Perl-Skriptes direkt durchschleusen:
passthru("/pfad/zum/perlskript.pl");
Vorher und hinterher kann PHP seine HTML-Teile ausgeben - das Perl-Skript darf dann natürlich keine komplette Seite mehr ausgeben.

Auch das geht, bei mir! Aber noch zwei Fragen ;-)

  • Ist passthru() Sicherheitstechnisch besser einzuschätzen als popen()
  • Mit passthru() wird vor der eigentlichen Ausgabe des (Perl-)Scripts noch "Content-Type: text/html" ausgegeben, kann man das irgendwie unterdrücken? Die ganze passthru()-Funktion würde mir wenig nützen, wenn ich es dann nochmal in eine Variable packen müßte und den ollen Text rausfiltern muss.

http://www.php.net/manual/en/function.passthru.php

Übrigens Danke für die Links!!

2b: Du kannst auch die Ausgabe des Perl-Skriptes in PHP zunächst in eine Variable speichern und dann nochmals parsen, um Variablen zu ersetzen.
http://www.php.net/manual/en/language.operators.execution.php
http://www.php.net/manual/en/function.popen.php

Danke für den Hinweis, ist aber bei mir (noch) nicht nötig (mir fällt aber bestimmt noch etwas ein, bei dem Perl PHP-Code erzeugt ;-)

Hätte dieses Vorgehen - auch wenn keine (PHP-)Variablen da sind - sicherheitstechnisch Vorteile?

  1. Natürlich kannst du die Sache auch von Perl aus angehen. Lösung 1 funktioniert mit Perl im Prinzip genauso, nur eben perl-artig (und IMO etwas aufwendiger) mit dem Modul LWP::Simple.

Das hat Cheatah schon angedeutet, mir wäre aber diese Sache hier bedeutend lieber, da ich dann den existierenden footer und header so einbauen kann wie er ist, weiter kann ich dann die Variaben einfach an das PHP-Script übergeben und sie auch so im footer verwenden und muss nicht das ganze zusätzlich in einer Perl-Version unterbringen.

  1. Du kannst PHP-Skripte auch lokal als Skript ausführen, wenn der Interpreter passend eingerichtet ist. Dann gelten im Prinzip alle Möglichkeiten von Lösung 2.

Ähm, Du meinst wenn ich über ein Perl-Script als "Schnittstelle" arbeite?

Nun, jetzt kann ich mich nicht so eindeutig entscheiden, was ich nehmen soll: Ein einfaches include() oder passthru()? Was an passthru() ärgerlich ist ist die Ausgabe von "Content-Type: text/html". Gibt es - bei statischer URL - sicherheitstechnische Vorteile für passthru? Performancetechnisch ist sicher auch passthru() zu bevorzugen, da kein http-Request nötig ist, allerdings ist das Perl-Scrip auf dem gleichen Server, die Wege also recht kurz.

Mozz

P.S.: Noch mal ganz herzlichen Dank für die ausführliche  Antwort und Hilfe!!