Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8970[/thread]

mod_perl: Module als Module einbinden?: Einfaches Entwurfsmuster?

Leser: 1


<< >> 8 Einträge, 1 Seite
Lightman
 2007-05-05 22:19
#76485 #76485
User since
2007-01-31
57 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich bastel in meiner Freizeit immer noch ein meinem Mini-CMS. Nur leider kann ich mich nicht so recht für ein Design-Pattern entscheiden und will das ganze auch nicht irgendwo reinquetschen, zumal es nur wenige Funktionen besitzt (dachte zu erst an MVC).

Was ich aber ganz toll finden würde, ist die Möglichkeit, die Perl-Module auch wirklich als eigenständige Module zu verwenden, um so spätere Funktionen ohne Probleme einbinden zu können.

Beispiel: Es gibt ein extra Modul, mit dem man Mails verschicken kann. Das CMS selbst weiß weder, dass dieses Modul existiert, noch wie es funktioniert (okay, es weiß schon, dass es ein Modul "Mail" gibt, welches automatisch eingebunden wird). ;)

Wenn der Nutzer nun die URL index.cgi?module=mail&action=send plus POST-Parameter aufruft (ja, ich weiß, GET plus POST gleichzeitig macht man normalerweise nicht), wird ein Objekt von Mail erstellt und die Methode send mit den POST-Parametern aufgerufen.

Lange Frage kurzer Sinn: Ist dies überhaupt eine vernünftige Herangehensweise? Was würdet ihr besser oder ganz anders machen?
frankes
 2007-05-05 23:15
#76486 #76486
User since
2005-04-02
140 Artikel
BenutzerIn

user image
Hallo Lightman

Du kannst Mittels eval überprüfen ob ein Modul existiert und wenn dies der Fall ist, dieses zur Laufzeit mit Hilfe von require einbinden.
Dabei kannst du dann auch die entsprechenden Parameter für das Modul übergeben.

Beispiel:
Code: (dl )
1
2
3
4
5
6
7
8
no strict 'refs';
if (eval "require $modul"){ &n
bsp;
require $modul.'.pm';
@back=&{$modul.'::content'}(@param);
}
else {die 'Modul nicht ladbar'}
use strict 'refs';


Allerdings muss ich ehrlich sagen, dass ich gewaltig Bauchschmerzen habe, wenn man wie von dir geplant in einem CMS von außen beliebige Module nachladen kann. Gibt es doch auch einige Standartmodule, mit denen man gewaltigen Schaden (Dateien und Verzeichnisse löschen, Zugriff aufs System ...) anrichten kann.

Sinnvoller wäre eine Schnittstelle innerhalb des CMS, über das der Admin zusätzliche Module einbinden kann, welche nicht von außen erreichbar ist. ZB. mit einer Config Datei.
Lightman
 2007-05-05 23:25
#76487 #76487
User since
2007-01-31
57 Artikel
BenutzerIn
[default_avatar]
Hallo frankes.

Sowas habe ich mir auch gedacht. Entweder man inkludiert die Module via Config-Datei oder import sie aus einem extra Verzeichnis (so dass alle Module in diesem Verzeichnis eingebunden werden). Bei Weblog-Systemen wie z.B. WordPress wird es ja auch so ähnlich gemacht, über die Sicherheit würde ich mir da in erster Linie keine Sorgen machen (entsprechende Systeme und Schranken würde ich natürlich einbauen, dass man keinen Schaden anrichten kann).

Würdet ihr das für ein gutes Entwurfsmuster halten, oder sollte ich lieber auf z.B. MVC zurückgreifen? Was spricht dafür und dagegen? (aus eurer Sicht als erfahrende Perl'ianer)
RalphFFM
 2007-05-06 00:41
#76488 #76488
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Kann man die CMS-Teile die schon existieren irgendwo "besichtigen" i.S.v. ausprobieren? Bin allgemein am Thema CMS interessiert. Auch deshalb, weil CMS-Skripte wie kaum anderes so unterschiedlich sind in Ansätzen und Vorgehensweisen. Welche Features soll Dein CMS bekommen?
Lightman
 2007-05-06 01:42
#76489 #76489
User since
2007-01-31
57 Artikel
BenutzerIn
[default_avatar]
Das CMS hatte ich bereits vor ein paar Jahren in PHP geschrieben, aber eher unsauber gelöst, weshalb ich es in Perl neuschreiben möchte. Viele Sachen funktionieren deshalb z.Z. nur experimentell und sind nicht wirklich fertig (zumal ich neben dem Studium kaum Zeit dafür finde).

Wie gesagt, es ist ein kleines CMS. Folgende Module sind in der Rohform vorhanden: Param-Parser (für POST & GET, später noch COOKIE), Config (d.h. Config-Datei einlesen, z.B. mit Datenbank-Informationen), Template (Vorlagen parsen), Mail (E-Mails versenden), Database (Datenbank-Klasse um Verbindungen herzustellen und Queries zu prepare'n). Sind aber nur ein paar Basis-Methoden vorhanden, man kann also nicht viel mit anfangen, außer es zu testen.

Folgende Sachen fehlen noch: Sessions, Login, Administrations-Oberfläche, Datei-Upload, RSS, das ganze Frontend.
Dubu
 2007-05-28 23:30
#76490 #76490
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Obwohl der Thread schon etwas alt ist, muss ich etwas zur Sicherheit anmerken.

[quote=frankes,05.05.2007, 21:15]
Code: (dl )
1
2
3
4
5
6
7
no strict 'refs';
if (eval "require $modul"){
 require $modul.'.pm';
 @back=&{$modul.'::content'}(@param);
}
else {die 'Modul nicht ladbar'}
use strict 'refs';


Allerdings muss ich ehrlich sagen, dass ich gewaltig Bauchschmerzen habe, wenn man wie von dir geplant in einem CMS von außen beliebige Module nachladen kann.
[/quote]
Die Bauchschmerzen bekommst du ganz zu recht, denn wenn der Inhalt von $modul (ungeprüft) von außen kommt, ist der Code oben reinster Selbstmord.  Wenn ich als Benutzer z.B. die folgende URL übergebe (analog zu dem, was Lightman als Beispiel für mail genannt hatte):
Code: (dl )
http://example.org/index.cgi?module=strict%3B%20system%20'rf%20-rf%20%2F'%3B&action=send

dann ergibt das folgenden Code:
Code: (dl )
1
2
if (eval "require strict; system 'rf -rf /';"){
....

Da hat der Webserver evtl. ein Problem.

Wenn du ohnehin ein require $modul.'.pm' nach dem String-eval machst, dann wäre doch ein Block-eval der bessere Ersatz:
Code: (dl )
1
2
3
4
5
6
7
eval {
  require "$modul.pm";
}
if ($@) {
   die "Modul $modul kann nicht geladen werden!"
}
...

Das ist zumindest etwas sicherer als das String-eval.
Trotzdem würde ich eine Konfigurationsdatei bevorzugen.

Und, Lightman: -T nicht vergessen!
Dubu
 2007-05-28 23:40
#76491 #76491
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Noch etwas allgemeines:

[quote=Lightman,05.05.2007, 23:42]Folgende Module sind in der Rohform vorhanden: Param-Parser (für POST & GET, später noch COOKIE), Config (d.h. Config-Datei einlesen, z.B. mit Datenbank-Informationen), Template (Vorlagen parsen), Mail (E-Mails versenden), Database (Datenbank-Klasse um Verbindungen herzustellen und Queries zu prepare'n).[/quote]

Das hört sich nach Aufgaben für sehr verbreitete Module an:
Param-Parser => CGI.pm
Config => Config::Simple, Config::Any, Config::IniFiles, ...
Template => HTML::Template::Compiled, Template-Toolkit, ...
Database => DBI.pm

Ich hoffe mal, dass du auch jeweils Module eingesetzt hast.
renee
 2007-05-29 00:30
#76492 #76492
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Und für Mail-Versand gibt es auch sehr gute Module wie CPAN:MIME::Lite oder CPAN:Mail::Sender. Zu letzterem gibt es in unserem Wiki auch einen Artikel.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< >> 8 Einträge, 1 Seite



View all threads created 2007-05-05 22:19.