Develop-Zone
== Das Sicherheitslabor ==

Taint Check mit MacPerl

MacPerl hat wie das UNIX-Perl einen Taint Check Mechanismus. Es gibt jedoch ein paar Komplikationen, die ich hier erläutere: Perl müssen die Pfade mitgeteilt werden, unter denen es seine Module findet. Unter UNIX werden die Pfade zu den benutzten Bibliotheken hart einkompiliert, das heißt sie sind fest in das Perl Programm selbst eingebrannt. Unter dem Mac geht dieses nicht, weil der Benutzer jederzeit den Namen seiner Platte ändern kann.

Die erste Folge hiervon ist, daß man Taint Checking nicht wie unter UNIX in der ersten Zeile des Skriptes einschalten kann:

#!/usr/local/lib/perl -T
 

Statt dessen kann man Taint Checking in der MacPerl Applikation selber in dem Menü "Skript" einschalten.

Eigentlich ist das ja auch viel schöner, es hat allerdings den Nachteil daß wir Taint Checking damit automatisch für alle Skripte einschalten. Eine Abhilfe schafft eine spezielle Extension, die die normale "Cgi Skript" Extension ersetzt: Die "CGI Script (Taint Check)" Version, geschrieben von Chris Nandor, erhältlich unter http://pudge.net/macperl/

Ein zweites Problem taucht auf, wenn wir Module, wie z.B. das hervorragende CGI-Modul verwenden: mit eingeschalteten Taint Check findet MacPerl die Module nicht mehr. MacPerl traut nämlich den voreingestellten Pfaden nicht mehr: sie könnten z.B. mit Apple Events manipuliert sein. Zur Zeit (MacPerl 5.19) kann man sich behelfen, in dem man MacPerl im Skript explizit mitteilt wo die Module stehen. Dieses funktioniert mit Hilfe der BEGIN-Anweisung, die von Perl noch vor dem Laden der Module ausgeführt wird. Eine einfache Version sieht folgendermassen aus:

BEGIN {
  unshift @INC,
    "Macintosh HD:MacPerl ƒ:lib:",
    "Macintosh HD:MacPerl ƒ:lib:MacPPC:";
}
#--- und jetzt das eigentliche Skript ----
use CGI;
...

Dies funktioniert so nur mit der PowerPC Version und auch nur, wenn die Festplatte "Macintosh HD" heißt und MacPerl im Ordner "MacPerl ƒ" liegt. Eine robustere Version, die sich selbst findet, sieht folgendermassen aus:
BEGIN {
  my $f = $ENV{MACPERL};
  $f =~ /^(.+)$/;
  unshift @INC,
    "${1}lib:$MacPerl::Architecture:",
    "${1}lib:";
# uncomment next line if you can not include CGI.pm
# print @INC, "\n";
}

Diese Version ist allerdings auch etwas unsicherer, dafür lassen sich die Skripte ohne Probleme von einem Rechner auf den anderen übertragen. Und sicherer als kein Taint Check zu benutzten ist diese Lösung alle Mal.

Zum Taint Check Beispiel: Der Kalkulator


home - contact - dev-zone
Copyright © 1997 by Karsten Meier. All Rights reserved.