(Sichere-)Namensräume und Opcode Restriktionen |
Da die meisten Web Server mehr als ein Dokument verwalten, ist es nötig,
die Dokumente gegeneinander zu schützen. Embperl benutzt dazu Perl
Namensräume (Packages). Standardmäßig führt Embperl jedes
Dokument in seinem eigenen Namensraum aus. Das verhindert, das globale
Variablen, sich gegenseitig überschreiben oder beeinflussen.
Mittels der Konfigurationsanweisung EMBPERL_PACKAGE ist es möglich
einen expliziten Packagenamen für ein oder mehere Dokumente vorzugeben.
Dies alles verhindert aber nicht, das durch die Angabe eines Variablennamen
incl. Packagenamen eine Embperlseite auf andere Namensräume zugreifen kann. Manchmal, z.B. wenn mehrere Personnen Zugriff auf die Webserverinhalte
haben sollen, ist es notwendig Dokumente tatsächlich gegenseitig zuschützen.
Für solche Fällen kann Embperl Safe.pm nutzen um sichere Namensräume
bereit zu stellen. Ein Dokument, das in einem solchen sicheren Namensraum
abläuft, kann dann nicht mehr auf andere Namensräume zugreifen. (Für weitere
Informationen zu sicheren Namensräumen lesen Sie bitte die Dokumentation
zu Safe.pm) Um ein Dokument in einem sicheren Namensraum ablaufen zu lassen, müssen
Sie lediglich die Option optSafeNamespace setzen.
Der Packagename wird dabei weiterhin automatisch von Embperl erzeugt
oder kann mittels EMBPERL_PACKAGE gesetzt werden. HINWEIS: Für das ausgeführte Dokument erscheint es so, als würde
der Code im Package main ausgeführt! Eine weitere Möglichkeit, um Embperl Seiten sicher zu machen, ist die
Benutzung von Opcode Restriktionen. Dazu ist es nötig, zuerst ein
Safe Compartment zu erstellen: B<$cp = Embperl::AddCompartment($name);> Dies erstellt ein neues Compartment mit einer Default Opcode Maske und dem
Namen $name (Der Name wird später verwendet, damit Embperl weiss, welches
Compartment es benutzen soll). Nun können
Sie die Opcode Maske ändern. Zum Beispiel: B<$cp->deny(':base_loop');> In Ihrer Konfiguration müssen Sie die Option optOpcodeMask in
EMBPERL_OPTIONS setzen
und spezifizieren aus welchem Compartment die Opcode Maske (durch setzen von
EMBPERL_COMPARTMENT) genommen werden soll. Beispiel (beim Gebrauch mit mod_perl): B<srm.conf:>
PerlScript startup.pl
SetEnv EMBPERL_DEBUG 2285
Alias /embperl /path/to/embperl/eg
<Location /embperl/x>
SetHandler perl-script
PerlHandler Embperl
Options ExecCGI
PerlSetEnv EMBPERL_OPTIONS 12
PerlSetEnv EMBPERL_COMPARTMENT test
</Location>
B<startup.pl:>
$cp = Embperl::AddCompartment('test');
$cp->deny(':base_loop'); Beim Starten des Server wird dadurch die Datei startup.pl ausgeführt.
startup.pl erstellt einen Compartment mit Namen
'test', in dem Schleifen gesperrt sind. Alle Seiten die unter
/embperl/x liegen, werden nun in einem sicheren Namensraum, mit
gesperrten Schleifen, ausgeführt. Hinweis: Das Package Name des Compartments wird nicht genutzt! Mehr Information zum Setzen der Opcode Mask finden Sie in der Dokumentation von Safe.pm und
Opcode.pm.
|