Thread Kontrolle DB-Zugriff für Plugins. Wie vorgehen? (4 answers)
Opened by Cremator at 2008-05-25 20:53

Cremator
 2008-05-25 20:53
#110289 #110289
User since
2003-11-26
97 Artikel
BenutzerIn
[default_avatar]
Mein Hirn is grad sowas von vernagelt, ich brauch mal ne zweite (oder auch dritte) Meinung. Hier mal die allgemeine Beschreibung:

Ich hab ein Skript mit Datenbankverbindung, das Erweiterungs-Module (Plugins) laden kann.

Einerseits will ich die Module nicht einschränken und Zugriff auf die komplette Datenbank ermöglichen.

Andererseits hab ich mir überlegt, das ich doch gerne die Daten oder den Zugriff auf die DB-Tabellen irgendwie abstrahieren und absichern möchte. Zum einen damit die Erweiterungsmodule noch funktionieren, wenn sich die Datenbank ändert, zum anderen weil man nie weiss wie gut oder schlampig die Erweiterungen geschrieben werden (und ich will kein kostenloses Code-Review für jedes neue Modul machen).

Erste Idee:
Eine DB-Klasse die instanziert, an die Erweiterung übergeben wird und dazu dient die Datenbank abzufragen. Diese liefert die entsprechenden Daten-Objekte an die Erweiterung zurück (sozusagen Factory Light). Ungefähr so
Code (perl): (dl )
1
2
3
@groups = $db->get_subgroups_of('Allgemein');
#oder auch
@items = $db->get_items_filtered('customer' -> 'Schmidt', 'min_date' -> '2007-01-01', 'min_value' -> 100.00);
Scheidet aber aus, da diese Klasse bei jedem neuen Modul wieder um die passenden Objekte erweitert werden müsste.

Zweite Idee:
Jede Erweiterung muss eine Art Installations-Sub bereitstellen, die einmal aufgerufen wird um das Modul zu aktivieren bevor es verwendet werden kann. Dabei muss das Modul beim Skript "anmelden" mit welchen DB-Tabellen es arbeiten will. Versucht das Modul auf andere Tabellen zuzugreifen, wird abgebrochen und ne Fehlermeldung ausgespuckt. Ist zwar nur die halbe Miete, sollte aber das gröbste an Schindluder von der Benutzerseite verhindern.

Dazu brauchts aber auch eine DB-Klasse, die die Zugriffe kontrolliert. Kompletter SQL-Parser ist nicht akzeptabel (bzw. zu aufwändig) und Subroutinen ala
Code (perl): (dl )
@rows = $db->get(@tables, @fields, @filter_conditions);
sind bei einfachen SQL-Statements ja noch machbar, aber bei komplexeren WHERE-Klauseln mistig bis totaler Krampf.

Grosse Frage: Wie würdet Ihr das implementieren oder habt Ihr ne andere zündende Idee?

View full thread Kontrolle DB-Zugriff für Plugins. Wie vorgehen?