Hallo Leute!
Habe in letzter Zeit sehr viel mit perl-cgi Scripts und Javscript gemacht.
Ich hatte folgendes Problem:
Ich wollte es von meinem Script aus ermöglichen, gewisse Daten zu speichern. Es sollte sich nach einem Buttonclick ein Popup öffnen, in dem man einen Filenamen eingeben kann in dem die Daten gespeichert werden.
Also, nach Eingabe des Filenamen clickt man auf nen ok-Button, worauf dann ein formular mit Filenamen und Daten an ein neues cgi-script abgeschickt wird.
In diesem muss man dann die "open()" funktion verwenden um das File anzulegen und die Daten darin zu speichern. Das ganze hat bei mir allerdings nicht funktioniert und als ich mein Problem hier im Forum geschildert hatte konnte mir keiner helfen.
Ich bin alleine auf die Lösung gekommen und wollte sie ins Forum posten für jene, die ein ähnliches Problem haben und vor dem Verzweifeln sind.In Perl gibt es den sogenannten taint-mode.
Das ist ein Perl modus, der es "unsicheren" Funktionen nicht erlaubt ausgeführt zu werden außer der Programmierer erlaubt es explizit in seinem Script.
"open()" ist einer dieser Funktionen. Wenn man will, dass ein User seinen Filenamen frei wählen darf, ist das ein Sicherheitsrisikio von außen (wenn man den filenamen "hardcoded" funktioniert alles wunderbar ohne taint-mode).
Damit das ganze funktioniert muss man folgendes beachten:
1)
Bei perl 4 muss die shebang Zeile geändert werden von z.B.: "#!/usr/local/bin/perl -w" auf
"#!/usr/local/bin/taintperl -w"
Bei perl 5 auf "#!/usr/local/bin/perl -w -T"
(Oft kann man den taint mode bei Webservern im Vorhinein aktivieren).
2) Man braucht einen Ordner auf dem man Ausführungs- und Schreibrechte besitzt(Wenn man selber admin ist, ist das eh kein Problem sonst admin fragen).
3) Man muss mit einem regulären Ausdruck den Filenamen auf ein gewisses aussehen oder auf gewisse Zeichen beschränken.
Dann sollte alles Problemlos funktionieren, was wie folgt aussieht:
if($myFile =~ /^([-\w.]+)$/)
{
$myFile=$1; #data is tainted
}
else
{
die "Ungueltige Zeichen in '$myFile'";
}
// Bei open ist es auch sehr wichtig einzelne
// Hochkomma ('') statt doppelte zu verwenden
// ("")!
open (FILE, '>/usr/local......'.$myFile) or die "Datei konnte nicht geoeffnet werden: $!\n";
print FILE $data;
close FILE;
Sorry für den ganzen Text, aber ich wollte es ausführlich beschreiben, weil ich nichts weniger ausstehen kann, wenn man nach Lösungen für Probleme in Foren sucht und dann nur halbe Antworten findet.
lg emu
Datum: 17.09.2007-11:59
