Hallo Unbekannter
Bist du etwa CK? Anscheinend machst du gute Fortschritte beim Japanisch lernen ! ;-)
du lässt also den Benutzer auf deinem Dateisystem herumfuhrwerken? Ist ja irre toll. Blacklisting funktioniert nicht.
Ich habe keine andere Wahl. Ansonsten verliert das Skript massiv an dynamik. Aber ich bin mir der Gefahr bewusst, darum frag ich hier. Ich will jedoch keine Blacklist, sondern eher eine Whitelist: alles, was unter einem bestimmten Verzeichnissen liegt, soll dem User gezeigt werden. Die Sache ist nicht enorm kritisch, da dieser Bereich des Servers per AuthDigest geschützt ist und ich keine bösen User habe. Nichts desto trotz will ich natürlich so sicher wie möglich programmieren.
Wenn du sicher sein willst, ersetze den ganzen Kram durch eine Dispatchtabelle. Alles, was nicht unter deiner Fuchtel steht, wird abgewiesen.
Das geht leider nicht, da ich nicht sagen kann, welche Daten auf dem Server liegen. Diese werden per WebDAV von mehreren Benutern verwaltet.
Du arbeitest in einer Umgebung, in der feindliche Daten von außerhalb zu erwarten sind, sprich CGI. Benutze Taintmode.
#!/usr/bin/perl -T
Danke für den Hinweis! Ich werde mich diesbezüglich mal schlau googeln.
> > # Character encoding
> > use utf8;
> > use encoding 'utf8';
> Das ist doppeltgemoppelt. Beide macht dasselbe, nämlich du darfst den Perlquellcode in UTF-8 schreiben, z.B. Bezeichner und literale Strings. Du nimmst dies aber gar nicht in Anspruch. Entferne die Pragmas.
Das stimmt leider nicht ganz. use utf8 kann ich ohne Probleme entfernen, wenn ich jedoch use encoding 'utf8' entferne, dann kommt mein Inhalt beim Browser nicht mehr als UTF-8 an.
> > if (not (-T "$path")) {
> > $path = 'index.html';
> > }
> Bezweckst du etwas mit der Evaluierung der Variable $path hier? Wenn nicht, dann entferne die Quotes. Perliger schreibt man es so:
> ~~~perl
> $path = 'index.html' unless -T $path;
>
Ich _hatte_ das so aus einem Tutorial... An diese Perl-Konstrukte muss ich mich noch ein wenig gewöhnen.
open(FILE, $source);
Benutze die Dreiargumenteform der open-Funktion. Benutze lexikalische Filehandles.
open my $fh, '<', $source or die "could not open <$source> for reading: $!";
Macht man das weil der Code konsistener ($ für alle Variablen) wird oder hat das noch andere Gründe?
> \*Prüfe immer, immer Rückgabewerte von Systemaufrufen!\*
Asche auf mein Haupt...
> > if (!utf8::is\_utf8($buffer)) {
> > utf8::decode($buffer);
> > }
> Bitte ausreichend in der Quelle kommentieren. Was bezweckt das? Wieso hast du das Konstrukt verwendet?
Du hast recht, in diesem Beispiel brauche ich das nicht. Während der Entwicklung habe ich den Dateiinhalt jedoch direk in den Ausgabestream geleitet, und dann bekam ich bei einer ISO-8895-1-codierten Datei kein UTF-8 zurück.
> Mir ist das nicht geheuer. Das sieht aus wie Symptombekämpfung ohne Berücksichtung des fundamentalen Sachverhalts.
Das siehst du richtig: Ich habe nicht immer UTF-8-codierte Dateien, will diese jedoch immer als UTF-8 ausgeben. Das lässt sich leider nicht ändern.
Vielen Dank für deine guten Hinweise, die bringen mich wirklich weiter.
Gruss
Tom2