迪拉斯: Mein erstes Skript

Beitrag lesen

Hey,

Das Skript nimmt die Parameter p (Pfad der XML-Datei) und s (Pfad des XSL-Stylesheets) entgegen

du lässt also den Benutzer auf deinem Dateisystem herumfuhrwerken? Ist ja irre toll. Blacklisting funktioniert nicht.
Wenn du sicher sein willst, ersetze den ganzen Kram durch eine Dispatchtabelle. Alles, was nicht unter deiner Fuchtel steht, wird abgewiesen. Die Lösung hat die Vorteile, dass der Dateityp schon meta mitgegeben wird und du dich nicht mit Untainting umherschlagen brauchst.

  
my %textfiles = (  
 gruenkohl => 'res/gruenkohl.txt',  
 # fülle mich  
);  
my %xmlfiles = (  
 zwiebel => 'roflcopter/z.xml',  
 # mich auch  
);  
if (  
 (exists $textfiles{$path})  
 or  
 (exists $xmlfiles{$path})  
) {  
 # Verarbeitung  
} else {  
 die "invalid p: $path";  
};  

Natürlich bin ich auch um sonst jeden Tip froh, der meinen Perl-Code verbessert.

Du arbeitest in einer Umgebung, in der feindliche Daten von außerhalb zu erwarten sind, sprich CGI. Benutze Taintmode.

  
#!/usr/bin/perl -T  

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.

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:

  
$path = 'index.html' unless -T $path;  

sub text2html {

Stelle Subdeklarationen an den Anfang des Programms. Es ist guter Stil und bewahrt dich davor, die Sub vorwärts deklarieren zu müssen, um die Missinterpretation als unbekanntes Bareword zu verhindern, wenn du sie jemals ohne Klammern aufrufen solltest.

open(FILE, $source);

Benutze die Dreiargumenteform der open-Funktion. Benutze lexikalische Filehandles. *Prüfe immer, immer Rückgabewerte von Systemaufrufen!*

  
open my $fh, '<', $source or die "could not open <$source> for reading: $!";  

if (!utf8::is_utf8($buffer)) {
   utf8::decode($buffer);
  }

Bitte ausreichend in der Quelle kommentieren. Was bezweckt das? Wieso hast du das Konstrukt verwendet?
Mir ist das nicht geheuer. Das sieht aus wie Symptombekämpfung ohne Berücksichtung des fundamentalen Sachverhalts.

--
水-金-地-火-木-土-天-海-冥