Patrick Andrieu: Tainted Love again, .pl vs .cgi - Lese-Wink an Alexander(HH)

Beitrag lesen

Hallo Alexander!

1&1 (Apache auf Debian-Linux):
.pl wird ausgeführt auch mit #!perl oder #!perlhuhn
Das ist für ein Unix-CGI ungewöhnlich.

Ich war auch überrascht!

Das Script wird definitiv nicht per exec()-Systemcall aufgerufen, sondern irgendwie in einen schon laufenden Interpreter gezogen.

Sieht so aus...

Apache lokal:
.pl wird ausgeführt auch mit #!perl oder #!perlhuhn
.cgi wird ausgeführt NUR mit #!perl oder #!C:\perl\bin\perl.exe, NICHT ABER mit #!/usr/bin/perl (ScriptInterpreterSource registry)
Es gibt eine Besonderheit von Perl bei #!-Zeilen:
If the #! line does not contain the word "perl", the program named after the #! is executed instead of the Perl interpreter. This is slightly bizarre, but it helps people on machines that don't do #!, because they can tell a program that their SHELL is /usr/bin/perl, and Perl will then dispatch the program to the correct interpreter for them. -- http://perldoc.perl.org/5.8.8/perlrun.html
Eigentlich wäre das eher eine Erklärung, warum die C:\perl\bin\perl.exe-Variante nicht funktioniert. Denn Perl macht ein @words=split '/',$shebangline und findet dann @words=("C:\perl\bin\perl.exe"). Auch unter Windows sollst Du ÜBERALL in Perl den Forward Slash benutzen (Windows selbst hat wie auch schon DOS außer in command.com und cmd.exe damit überhaupt kein Problem).
Hast Du eine Verknüpfung von *.cgi mit perl.exe eingerichtet?

Ja. Habe es allerdings über die Eigenschaften von Datei, Öffnen mit -> Ändern gemacht - und nicht in der Registry nachgeprüft, ob bei es die gleichen Schlüssel wie bei .pl gibt.

Halbwegs sinnvolles Verhalten. Was macht Xitami, wenn ich meine CGIs durch awk oder lua laufen lassen will? Schneidet Xitami einfach alle Pfade weg und ruft dann CreateProcess() auf, in der Hoffnung, awk und lua in $ENV{PATH} zu finden, oder ist Perl ein Sonderfall?

Keine Ahnung ;)

Hmmm, dan gäbe es noch FastCGI und PersistentPerl alias SpeedyCGI. Letzteres ist exotisch, FastCGI ist allerdings durchaus üblich. Sieh mal nach, ob in %INC (nicht @INC) etwas von FCGI.pm oder CGI/Fast.pm steht.

print "%INC contains:\n";
for (sort keys %INC)
{
  print "$_ : $INC{$_}\n";
}

Ausgabe:

CGI/Carp.pm : /usr/share/perl/5.6.1/CGI/Carp.pm
Carp.pm : /usr/share/perl/5.6.1/Carp.pm
Exporter.pm : /usr/share/perl/5.6.1/Exporter.pm

Und vor allem: Das Perl ist ANTIK! Das Relase-Datum von Perl 5.6.1 ist der 8. April 2001. Das erklärt auch die fehlende Ausgabe von ${^TAINT}, denn in 5.6.1 ist die Variable nicht vorhanden.

Ja. $] wird ausgegeben, $^V nicht.

Ob Taint in der Antiquität wirklich aktiv ist, mußt Du sehr umständlich rausfinden: sub is_tainted auf $ENV{'PATH'} oder sonst eine garantiert "taintete" Variable anwenden.

Werde mich schlau machen, danke. Ich bin dank Dir jetzt schon schlauer als vorher ;)

Ausgabe auf dem lokalen Apache:
Du meinst 1&1?

Nein, das war wirklich auch der lokale Apache, wie gesagt, ich habe ScriptInterpreterSource registry noch nicht geändert.

Viele Grüße aus Frankfurt/Main,
Patrick

--

_ - jenseits vom delirium - _
[link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
Nichts ist unmöglich? Doch!
Heute schon gegökt?