Embperl - building dynamic websites with Perl


(Sichere-)Namensräume und Opcode Restriktionen
[ << Prev: Session Handling (ab 1.2b2) ] [ Content ] [ Next: Utility Funktionen >> ]

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.


[ << Prev: Session Handling (ab 1.2b2) ] [ Content ] [ Next: Utility Funktionen >> ]


© 1997-2023 Gerald Richter / actevy