Antworten auf deine Fragen:
Neues Thema erstellen

Datenbankzugriff einschränken

Hallo,

ich möchte ein Script schreiben, dass die Verwendung von Erweiterungen (Modulen/Plugins) erlaubt. Diese dürfen auch Datenbankzugriff erhalten, jedoch nur für eine für sie erstellte Tabelle.
Das ist nicht so einfach, denn ich initialisiere für das "Core-Script" bereits in eine Variable ein Objekt, dass Zugriff auf alle Tabellen der Datenbank hat. Nun könnte ich zwar eine Klasse schreiben, die eine Lösung nur für die Erweiterungen darstellt, jedoch könnte die Erweiterung ja auch mit "global" auf das initialisierte Objekt/Variable zugriff erhalten und damit wäre alles für die Katz.

Daher, wie realisiert man ein Script, dass Erweiterungen verwendet, diese jedoch nur Zugriff auf deren interne Tabelle erhalten sollen?
(Im Beispiel: Facebook-Anwendungen können auch Daten speichern, jedoch auch hier nur in der eigenen Tabelle und erhalten auch keinen Zugriff auf andere Daten in der Datenbank. Dieses Prinzip möchte ich verfolgen, doch wie?)
 

Duddle

Posting-Frequenz: 14µHz

AW: Datenbankzugriff einschränken

Spontan fällt mir ein, dass mit Account-Rechten zu lösen, die den Zugriff beschränken.

Sagen wir ein PlugIn Foo wird in der Datenbank Bar installiert. Zuerst werden normal die Tabellen Bar.Tab_1, Bar.Tab_2, etc. erstellt. Dann wird ein exklusiver Account für Foo . Zuletzt werden ihm alle benötigten Rechte für die soeben erstellten Tabellen .

Die verlinkten Artikel zeigen auf die MySQL-Syntax. Falls dir das zu unübersichtlich ist, gibt es einige Tutorials bzgl. der Nutzer- und Rechteverwaltung. Beispiele:
http://www.html-world.de/program/mysql_8.php




Duddle
 
AW: Datenbankzugriff einschränken

Danke, Account-Rechte für den MySQL-Zugriff sind eine gute Idee, jedoch lösen sie das Hauptproblem nicht.
Wenn ich am Anfang des Scriptes sagen wir mal mit der Variable $connection eine Verbindung mit dem MySQL-Benutzer erstelle, der Zugriff auf alle Tabellen habe und der Variable $connection_erweiterungen eine Verbindung des Benutzers aufbaue, der Zugriff auf nur eine Tabelle der Datenbank hat, habe ich zwar geregelt wer was auslesen und inserieren kann, jedoch:
Kann die Erweiterung ja durch "global" oder sonst wie auf die Variable $connection zugreifen und damit hat sie Zugriff auf alle Tabellen.

Wie kann ich das umgehen?
 

Duddle

Posting-Frequenz: 14µHz

AW: Datenbankzugriff einschränken

Wenn du davon ausgehst, dass deine PlugIn-Entwickler die Namen aller deiner Variablen und Klassen kennen, gibt es ziemlich viele potenzielle Sicherheitslücken.

Ich finde jedenfalls kein Best Practice dafür. Mein Ansatz wäre wohl, Verbindungen zu Datenbanken mit wichtigen Daten nach Verwendung explizit zu schliessen bzw. die Variable zu nullen.


Duddle
 
AW: Datenbankzugriff einschränken

Dann müsste ich aber ja für 30 querys in einem Scriptablauf 30 Verbindungen neu erstellen, dass zieht wahrscheinlich unheimlich an Performance.
Ich denke nicht, dass die Hersteller von Facebook eine solche Sicherheitslücke nicht schließen konnten. Da gibts sicherlich eine Variante.
 

Duddle

Posting-Frequenz: 14µHz

AW: Datenbankzugriff einschränken

Gut, es ist schon ein deutlicher Sprung von "wie könnte das denn funktionieren?" zu "dutzende von Spezialisten bei FaceBook haben eine Lösung entwickelt" :)

Aus Interesse habe ich mir mal grob angeschaut, was FaceBook nach aussen anbietet. Da ich selbst keinen Account habe, konnte ich mir kein richtiges fertiges Beispiel anschauen um es in Aktion zu sehen. Die geben aber einen guten Überblick:

Falls ich das richtig verstehe, haben App-Entwickler ihren Code auf einem eigenen Server und registrieren die URL davon bei FB. Zwischen diesen beiden Endpunkten (Seite der App <-> FaceBook) wird dann ausschließlich über die API kommuniziert. Das heißt, wenn ein FB-Nutzer die App nutzen möchte, sucht FB den Endpunkt und fragt dort nach den notwendigen Informationen.

Sobald das über die APIs läuft, ist die Abgrenzung verschiedener Module kein Problem mehr. Deine Frage tritt nur auf, wenn du den PlugIn- bzw. App-Code z.B. per include() direkt bei dir selbst ausführst.


Duddle
 
Zuletzt bearbeitet:

ChrisvA

Aktives Mitglied

AW: Datenbankzugriff einschränken

Also das auf globale Variablen zugegriffen werden kann, kann man nur verhindern, wenn man erst gar keine Globalen Variablen verwendet.

Den eingeschränkten Zugriff kann man eigentlich nur erreichen, indem man entweder für jedes Plugin eine eigene Datenbank anlegt. (z.B.: SQLite ) und dann dem Plugin nur auf eine solche Datenbank eine Verbindung übergibt, oder du musst eine Art API schreiben, über die man auf erstellte Tabellen zugreifen kann. Das ist dann aber für die Entwickler nicht ganz so schön, da man dann nur bestimmte von der Software vorbereitete SQL-Abfragen ausführen kann.
 

ChrisvA

Aktives Mitglied

AW: Datenbankzugriff einschränken

Ich würde mal behaupten gar nicht, entweder eine Variable ist Global, oder sie ist es nicht, in der Form wie in C, dass man da noch Variablen auf eine Datei beschränken kann, wäre mir in PHP neu.

Entweder du musst also den Skripten ein gewisses "vertrauen" entgegenbringen, oder was besser ist, komplett auf globale Variablen verzichten.

Der Verzicht könnte funktionieren, indem du nur eine einzige Funktion aufrufst, die alles regelt, diese Funktion kann mittels statischer Variablen sicherstellen, dass sie auch nur ein einziges mal (von dir) aufgerufen wird, alle weiteren Aufrufe werden dann verworfen.

Wobei ich mich dann auch nicht so tief in PHP aus kenne, ob man auch hier irgendwelche Methoden hat an die Variablen ran zukommen.

Gerade MySQL Zugangsdaten müssen ja irgendwo gespeichert werden und man kann nicht verhindern, dass von einem anderen Skript einfach die Datei aufgerufen wird und die Daten für eine eigene Verbindung ausgelesen werden.

Falls du den Skripten nicht "vertrauen" kannst, bleibt wohl nur der Weg über eine API, z.B. über XML.
 

Duddle

Posting-Frequenz: 14µHz

AW: Datenbankzugriff einschränken

Gerade MySQL Zugangsdaten müssen ja irgendwo gespeichert werden und man kann nicht verhindern, dass von einem anderen Skript einfach die Datei aufgerufen wird und die Daten für eine eigene Verbindung ausgelesen werden.

Genau das ist das Problem. PHP ist es egal, ob eingebundener Code von einer fremden Quelle stammt oder nicht. Einzelne Module können also auf alle Möglichkeiten von PHP zugreifen. Dazu zählen eben auch Variablen.

Deshalb fall mir für diesen Fall nur drei Optionen ein:
  1. dem Code vertrauen
  2. den Zugriff auf den Hauptcode zulassen, aber vor dem Ausführen von Fremd-Code alle wichtigen Variablen zu löschen
  3. die Module untereinander isolieren und die Kommunikation nur über Schnittstellen erlauben


Duddle
 

ChrisvA

Aktives Mitglied

AW: Datenbankzugriff einschränken

Variablen aus dem Code löschen würde ich erst gar nicht versuchen,mit eval() oder $$var hat man viel zu viele Möglichkeiten so etwas am Löscher vorbei zu schmuggeln.
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.565
Beiträge
1.538.066
Mitglieder
67.488
Neuestes Mitglied
Andrew56524
Oben