Abstrakte Datenbankverbindungsschicht

Abstrakte Datenbankverbindungsschicht

am 07.07.2006 15:11:14 von m.pichlo

Hallo Leute,

bei JSP kann man (ich meine) im Tomcat Datenbankverbindungen
konfigurieren. Die entsprechend zu dieser Konfiguration "deployte"
Anwendung kann nun diese Datenbankverbindung nutzen ohne Kentnisse
über die Verbindungsdaten (Host, Benutzername, Passwort) zu haben.

Ich finde dieses Konzept ziemlich genial. Gibt es eine solche
"Abstraktionsschicht" auch für PHP? Es müsste eine Art Schnittstelle
sein, die die PHP-"Anwendung" anhand bestimmter Merkmale erkennt. Gibt
es so etwas oder denke ich in die völlig falsche Richtung?

In meinem konkreten Fall sollen kunden auf einen gemeinsamen
Datenbestand in MySQL zugreifen und dabei keine Kentniss über die
Verbindungsdaten haben. Natürlich könnte ich für jeden User einen
eigenen Benutzer anlegen - aber vielleicht geht es ja schöner.

Ich bin gespannt auf eure Antworten.

Viele Grüße aus Köln
Martin P.

Re: Abstrakte Datenbankverbindungsschicht

am 07.07.2006 18:27:02 von Kai Koenig

Hallo Martin,

ich weiß nicht, was du mit "PHP-Anwendung erkennen" meinst.
Vielleicht hilft dir ADOdb als Schicht zwischen PHP und der Datenbank? Damit
kannst du quasi die Datenbank austauschen, ohne den PHP-Code zu ändern
(theoretisch).
Wenn du nicht allzuviele verschiedene Benutzerrechte für deine DB hast,
kannst du doch einfach alle über die selbe Name/Passwort-Kombi abfragen
lassen. Die Zugangsdaten packst du dann in eine zu inkludierende Datei und
kannst sie so a) aus jedem Skript nutzen b) an zentraler Stelle ändern.
Du könntest über eine weitere Datenbank noch steuern, welche Rechte die
Benutzer haben, und dann z.B. gewissen Leuten bestimmte Befehle verweigern.
Dann kannst du aber auch schon fast die Benutzerrechte direkt über MySQL
steuern. Im phpmyadmin ist dazu jede Menge Code vorhanden :-)

Vielleicht habe ich dich auch völlig falsch verstanden?

Viele Grüße

Kai

schrieb im Newsbeitrag
news:1152277874.615767.158770@75g2000cwc.googlegroups.com...
Hallo Leute,

bei JSP kann man (ich meine) im Tomcat Datenbankverbindungen
konfigurieren. Die entsprechend zu dieser Konfiguration "deployte"
Anwendung kann nun diese Datenbankverbindung nutzen ohne Kentnisse
über die Verbindungsdaten (Host, Benutzername, Passwort) zu haben.

Ich finde dieses Konzept ziemlich genial. Gibt es eine solche
"Abstraktionsschicht" auch für PHP? Es müsste eine Art Schnittstelle
sein, die die PHP-"Anwendung" anhand bestimmter Merkmale erkennt. Gibt
es so etwas oder denke ich in die völlig falsche Richtung?

In meinem konkreten Fall sollen kunden auf einen gemeinsamen
Datenbestand in MySQL zugreifen und dabei keine Kentniss über die
Verbindungsdaten haben. Natürlich könnte ich für jeden User einen
eigenen Benutzer anlegen - aber vielleicht geht es ja schöner.

Ich bin gespannt auf eure Antworten.

Viele Grüße aus Köln
Martin P.

Re: Abstrakte Datenbankverbindungsschicht

am 08.07.2006 13:51:15 von m.pichlo

Hallo Kai,

danke für deine Antwort.

Kai schrieb:
> ich weiß nicht, was du mit "PHP-Anwendung erkennen" meinst.
Gibt es als Begriff bei PHP so natürlich nicht. Ich meinte z.B. ein
"CMS" als "Anwendung".

Kai schrieb:
> Vielleicht habe ich dich auch völlig falsch verstanden?
Ich fürchte schon ;-)

Martin schrieb:
> In meinem konkreten Fall sollen kunden auf einen gemeinsamen
> Datenbestand in MySQL zugreifen und dabei keine Kentniss über die
> Verbindungsdaten haben.
Ich versucht's nochmal *g*. Die Kunden haben z.B. den Teil des PHP
Quellcodes der auf die Datenbank zugreift (lesend und schreiben) in
ihrem htdocs Verzeichnis. D.h. auch die zentrale Datei mit den
Passwörtern kann von ihnen gelesen werden. Schlimmer noch: Sie können
mit ihrer Hilfe eigene Skripte ablegen, die Änderugen an der Datenbank
vornehmen können.

Ist das verständlicher? Beim angesprochenen JSP ist es so, dass selbst
der Programmierer die Zugangsdaten der Datenbank nicht kennt... ich
fürchte dass das bei PHP einfach nicht realisierbar ist. Eine Idee von
mir war, einen Mechanismus in die Datei mit den
Datenbankverbindungsdaten zu implementieren, die feststellt, wer sie
aufgerufen hat. Kommt der Zugriff von Seite x oder Seite y wird
verbunden bzw. das Ergebnis einer Anfrage zurückgegebe - sonst nicht.
Leider habe ich keine Variablen ($_SERVER["..."]) gefunden, mit denen
soetwas möglich wäre.

Ideen?

Re: Abstrakte Datenbankverbindungsschicht

am 08.07.2006 14:15:37 von Johannes Vogel

Hi Martin

m.pichlo@gmx.de wrote:
^-- Hier würde eigentlich der Name hingehören...
> bei JSP kann man (ich meine) im Tomcat Datenbankverbindungen
> konfigurieren. Die entsprechend zu dieser Konfiguration "deployte"
> Anwendung kann nun diese Datenbankverbindung nutzen ohne Kentnisse
> über die Verbindungsdaten (Host, Benutzername, Passwort) zu haben.
> Ich finde dieses Konzept ziemlich genial. Gibt es eine solche
> "Abstraktionsschicht" auch für PHP? Es müsste eine Art Schnittstelle
> sein, die die PHP-"Anwendung" anhand bestimmter Merkmale erkennt. Gibt
> es so etwas oder denke ich in die völlig falsche Richtung?
> In meinem konkreten Fall sollen kunden auf einen gemeinsamen
> Datenbestand in MySQL zugreifen und dabei keine Kentniss über die
> Verbindungsdaten haben. Natürlich könnte ich für jeden User einen
> eigenen Benutzer anlegen - aber vielleicht geht es ja schöner.

Ich verstehe dich so: Du bist ein Hoster und möchtest gerne deinen
Kunden ein Guestbook (kann ja auch ein CMS sein, ist ja dasselbe) zur
Verfügung stellen. Dabei sollen die Kunden aber nicht auf die DB
zugreiffen können, weil dadurch auch Schreibzugriffe möglich sein
müssen, welche sie nicht beschreiben dürfen.

Mir fallen einige Möglichkeiten ein:

i) Du schränkst das Recht ein, schlimmstenfalls auf Tupelebene. Das
könnte man wohl via Views lösen?

ii) Du hast die Queries in Klassen, wobei die Benützer keinen Zugriff
auf diese hat - jedoch der ausführende User (www-data) schon. Der Kunde
greifft auf seine Daten in der Form $db->getData(...) zu.

iii) Dasselbe liesse sich natürlich auch nur auf die Verbindung
anwenden. Also ein Objekt, welches eine DB-Verbindung anhand der User-ID
des Pfades des aufrufenden Scripts zurückgibt.

Aber mit iii würdest du nicht einschränken, dass die User nicht
irgendein Script schreiben, die Teile der DB kaputt macht. Ausser du
sperrst ihnen den Schreibzugriff seitens DB.

HTH, Johannes

Re: Abstrakte Datenbankverbindungsschicht

am 08.07.2006 16:53:08 von Niels Braczek

Martin P. schrieb:

> Ich versucht's nochmal *g*. Die Kunden haben z.B. den Teil des PHP
> Quellcodes der auf die Datenbank zugreift (lesend und schreiben) in
> ihrem htdocs Verzeichnis. D.h. auch die zentrale Datei mit den
> Passwörtern kann von ihnen gelesen werden. Schlimmer noch: Sie könn=
en
> mit ihrer Hilfe eigene Skripte ablegen, die Änderugen an der Datenban=
k
> vornehmen können.

Du kannst die Zugangsdaten unlesbar machen, zB. mit Ioncube.

MfG
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------

Re: Abstrakte Datenbankverbindungsschicht

am 10.07.2006 10:41:04 von m.pichlo

Hallo Johannes,

danke für deine Antwort.

Johannes Vogel schrieb:
> Ich verstehe dich so: Du bist ein Hoster und möchtest gerne deinen
> Kunden ein Guestbook (kann ja auch ein CMS sein, ist ja dasselbe) zur
> Verfügung stellen. Dabei sollen die Kunden aber nicht auf die DB
> zugreiffen können, weil dadurch auch Schreibzugriffe möglich sein
> müssen, welche sie nicht beschreiben dürfen.
Absolut richtig ;-)

> Mir fallen einige Möglichkeiten ein:
>
> i) Du schränkst das Recht ein, schlimmstenfalls auf Tupelebene. Das
> könnte man wohl via Views lösen?
Die Möglichkeit sehe ich so auch. Views müsste man aber schon nehmen,
da man sonst die Datensatzbeschränkung nicht hinbekommt. Mal sehen wie
weit MySQL das jetzt wirklich kann.

> ii) Du hast die Queries in Klassen, wobei die Benützer keinen Zugriff
> auf diese hat - jedoch der ausführende User (www-data) schon. Der Kunde
> greifft auf seine Daten in der Form $db->getData(...) zu.
So was fände ich super! Du meinst also ein extra
Verzeichnis.....*grübel*... hört sich gut an. Sind wir uns denn
sicher, dass der gewitzte Kunde nicht die Klasse ausgeben könnte? So
richtig setzt PHP das mit private nicht um, wenn ich mich richtig
erinnere - oder?

> iii) Dasselbe liesse sich natürlich auch nur auf die Verbindung
> anwenden. Also ein Objekt, welches eine DB-Verbindung anhand der User-ID
> des Pfades des aufrufenden Scripts zurückgibt.
Feine Idee...
> Aber mit iii würdest du nicht einschränken, dass die User nicht
> irgendein Script schreiben, die Teile der DB kaputt macht. Ausser du
> sperrst ihnen den Schreibzugriff seitens DB.
... hat mir bis gerade richtig gut gefallen. Verdammt ;-)

Möglichkeit ii) gefällt mir definitiv am besten. Das würde
allerdings eine Menge Konfigurationsaufwand pro Kunde. Aber das ist
vermutlich der Preis. Noch weitere geniale Einfälle ;-) ?

Viele Grüße
Martin

Re: Abstrakte Datenbankverbindungsschicht

am 10.07.2006 10:43:00 von m.pichlo

Hallo Niels,

> Du kannst die Zugangsdaten unlesbar machen, zB. mit Ioncube.

Finde ich von Ansatz her auch interessant. Aber mit etwas Analyse
hätte man vollen Zugriff auf die Datenbank. Aber danke für den Namen
der Software. Vielleicht nutze ich sie später mal.

Viele Grüße
Martin

Re: Abstrakte Datenbankverbindungsschicht

am 10.07.2006 10:53:04 von Alex Hepp

Martin P. schrieb:

> Ich versucht's nochmal *g*. Die Kunden haben z.B. den Teil des PHP
> Quellcodes der auf die Datenbank zugreift (lesend und schreiben) in
> ihrem htdocs Verzeichnis. D.h. auch die zentrale Datei mit den
> Passwörtern kann von ihnen gelesen werden. Schlimmer noch: Sie können
> mit ihrer Hilfe eigene Skripte ablegen, die Änderugen an der Datenbank
> vornehmen können.

Ööh, es ist also so, dass mehrere "Kunden" auf die Dateien derselben
PHP-Verzeichneisse zugreifen? Und Du möchtest verhindern, dass diese
Blödsinn mit der DB anstellen, weil der User im "zentralen"
DB-Konfigurationsskript einer mit fast allen Rechten ist?

> Ist das verständlicher? Beim angesprochenen JSP ist es so, dass selbst
> der Programmierer die Zugangsdaten der Datenbank nicht kennt... ich
> fürchte dass das bei PHP einfach nicht realisierbar ist.

Ein bisschen. Was Du wohl meinst, ist die Konfiguration von DataSources.
Wenn mich nich alles täuscht, gibt es glaube ich, ein Plugin / Mod für
apache2, mit dem das möglich ist. Wie Du dann allerdings PHP
konfigurieren / kompilieren / installieren musst, um das zum Laufen zu
bringen, kann ich Dir leider nicht sagen, geschweige denn, wie Du aus
PHP darauf zugreifst, ich hab es glaub ich nur mal irgendwo gelesen, und
jetzt mit "schnellgooglen" auch nichts gefunden ;)

> Eine Idee von mir war, einen Mechanismus in die Datei mit den
> Datenbankverbindungsdaten zu implementieren, die feststellt, wer sie
> aufgerufen hat. Kommt der Zugriff von Seite x oder Seite y wird
> verbunden bzw. das Ergebnis einer Anfrage zurückgegebe - sonst nicht.
> Leider habe ich keine Variablen ($_SERVER["..."]) gefunden, mit denen
> soetwas möglich wäre.

Woher ein Zugriff kommt, läuft über $_REQUEST['HTTP_REFERER'];
Allerdings ist dieser Wert nicht immer gesetzt (abhängig vom Browser).
Allerdings sehe ich noch nicht ganz, wie Du damit die Daten vor Deinen
"Kunden" verbergen willst...

>
> Ideen?
>

Hmm, klingt schwierig, weil die Idee eben ist, dass jeder User per
Username und PW identifiziert wird, und dass per Rechte bestimmt wird,
was er darf, und was nicht! Wenn dann veschiedene User quasi einen
Benutzer sharen, müssen sie auch alle die gleichen Rechte haben. Ist dem
nicht so, stimmt eben was nicht!

Oder hab ich Dich jetzt auch wieder flasch verstanden?
gruß alex

Re: Abstrakte Datenbankverbindungsschicht

am 10.07.2006 10:56:26 von Alex Hepp

Sorry für "Doppelpost"

Alex Hepp schrieb:
> Woher ein Zugriff kommt, läuft über $_REQUEST['HTTP_REFERER'];
^^^^^^^^^^
Es heisst natürlich $_SERVER['HTTP_REFERER']... Sorry..

> Allerdings ist dieser Wert nicht immer gesetzt (abhängig vom Browser).
> Allerdings sehe ich noch nicht ganz, wie Du damit die Daten vor Deinen
> "Kunden" verbergen willst...

Re: Abstrakte Datenbankverbindungsschicht

am 10.07.2006 12:31:29 von Johannes Vogel

Hi Alex

Alex Hepp wrote:
> Sorry für "Doppelpost"
> Alex Hepp schrieb:
>> Woher ein Zugriff kommt, läuft über $_REQUEST['HTTP_REFERER'];
> Es heisst natürlich $_SERVER['HTTP_REFERER']... Sorry..

Der Kunde sitzt auf dem selben Rechner... HTTP_REFERER ist sowieso schon
wäh, aber hier völlig unnötig. Pro User eine Identifikation (ID,
Verzeichnisname, etc) reicht schon...

>> Allerdings ist dieser Wert nicht immer gesetzt (abhängig vom Browser).
>> Allerdings sehe ich noch nicht ganz, wie Du damit die Daten vor Deinen
>> "Kunden" verbergen willst...

Eben: Wäh! :-)
Johannes

Re: Abstrakte Datenbankverbindungsschicht

am 10.07.2006 13:16:56 von m.pichlo

Hallo Alex,

> Ööh, es ist also so, dass mehrere "Kunden" auf die Dateien derselben
> PHP-Verzeichneisse zugreifen? Und Du möchtest verhindern, dass diese
> Blödsinn mit der DB anstellen, weil der User im "zentralen"
> DB-Konfigurationsskript einer mit fast allen Rechten ist?
Jeder Kunde hat seine eigenen Dateien. Aber unter anderem hat jeder
Kunde eine Datei in der die Zugangsdaten für die Datenbank stehen. Und
damit könnten sie dann blödsinn anstellen, wenn sie wollten...

> Was Du wohl meinst, ist die Konfiguration von DataSources.
> Wenn mich nich alles täuscht, gibt es glaube ich, ein Plugin / Mod für
> apache2, mit dem das möglich ist. Wie Du dann allerdings PHP
> konfigurieren / kompilieren / installieren musst, um das zum Laufen zu
> bringen, kann ich Dir leider nicht sagen, geschweige denn, wie Du aus
> PHP darauf zugreifst, ich hab es glaub ich nur mal irgendwo gelesen, und
> jetzt mit "schnellgooglen" auch nichts gefunden ;)
Danke für das Stichwort. Ich werde mal in diese Richtung forschen.

> Woher ein Zugriff kommt, läuft über $_SERVER['HTTP_REFERER'];
> Allerdings ist dieser Wert nicht immer gesetzt (abhängig vom Browser).
> Allerdings sehe ich noch nicht ganz, wie Du damit die Daten vor Deinen
> "Kunden" verbergen willst...
Über die $_SERVER Variablen wird es wohl nicht klappen. Das hatte ich
ja schon befürchtet. Aber solange man auf dem gleichen Server bleibt,
sollte Apache die nötigen Informationen eigentlich kennen. Ich
fürchte nur, dass er diese nicht exportiert: Folgendes hatte ich mir
überlegt. Aber das wird wohl nicht klappen:

test.php
------------
include("datenbank.php");

datenbank.php
---------------------
$herkunft =3D zauberfunktion(...);
if($herkunft == "http://www.domain.tld/verz1/ver2/test.php") {
..
}

> Hmm, klingt schwierig, weil die Idee eben ist, dass jeder User per
> Username und PW identifiziert wird, und dass per Rechte bestimmt wird,
> was er darf, und was nicht! Wenn dann veschiedene User quasi einen
> Benutzer sharen, müssen sie auch alle die gleichen Rechte haben. Ist dem
> nicht so, stimmt eben was nicht!
Die User sharen einen Benutzer und haben auch alle die gleichen Rechte.
Aber keiner der Kunden soll diese Rechte in eigenen Skripten nutzen
dürfen ;-) Also die Idee war, in einer Zwischenschicht eine Zuordnung
zwischen ausführender Datei und definiertren Zugangsdaten zu
realisieren (siehe Beispiel oben). Damit der Kunde dann an den Dateien,
denen ein Zugriff möglich ist keine Änderungen machen kann, kann man
diesen z.b. den Schreibzugriff entziehen.

Nochmal danke für deine Antwort.
Viele Grüße Martin

Re: Abstrakte Datenbankverbindungsschicht

am 10.07.2006 13:20:50 von m.pichlo

Hallo Johannes,


Johannes Vogel schrieb:
> Der Kunde sitzt auf dem selben Rechner... HTTP_REFERER ist sowieso schon
> wäh, aber hier völlig unnötig. Pro User eine Identifikation (ID,
> Verzeichnisname, etc) reicht schon...
Werde wohl auf Views zurück greifen und hoffen, dass MySQL diese
inzwischen anständig beherscht.

Re: Abstrakte Datenbankverbindungsschicht

am 10.07.2006 18:46:18 von Johannes Vogel

Hi Martin

Martin P. wrote:
> Johannes Vogel schrieb:
>> Der Kunde sitzt auf dem selben Rechner... HTTP_REFERER ist sowieso schon
>> wäh, aber hier völlig unnötig. Pro User eine Identifikation (ID,
>> Verzeichnisname, etc) reicht schon...
> Werde wohl auf Views zurück greifen und hoffen, dass MySQL diese
> inzwischen anständig beherscht.

Warum bestehst du auf MySQL? Postgres bspw. existiert.

HTH, Johannes

Re: Abstrakte Datenbankverbindungsschicht

am 10.07.2006 19:48:03 von Peter Marbaise

Johannes Vogel schrieb:
>>> Der Kunde sitzt auf dem selben Rechner... HTTP_REFERER ist sowieso schon
>>> wäh, aber hier völlig unnötig. Pro User eine Identifikation (ID,
>>> Verzeichnisname, etc) reicht schon...
>> Werde wohl auf Views zurück greifen und hoffen, dass MySQL diese
>> inzwischen anständig beherscht.
>
> Warum bestehst du auf MySQL? Postgres bspw. existiert.

ja sicher, aber die 5.0x kann doch Views

ciao Peter
--
WWW: http://www.marbaise.de Uptime: 0 Days 0 Hours
Projekt Stadtrecht
http://www.stadtrecht.de

Re: Abstrakte Datenbankverbindungsschicht

am 11.07.2006 11:38:23 von m.pichlo

Hallo alle zusammen,

Johannes Vogel schrieb:
> Warum bestehst du auf MySQL? Postgres bspw. existiert.

Der einzige Grund dafür ist, dass MySQL schon auf meinem System
vorhanden ist ;-)

Vielen Dank euch allen für eure Hilfe!
Viele Grüße
Martin