PHP / MySQL - Table an PHP Klasse binden ?

mercsen

Lt. Commander
Registriert
Apr. 2010
Beiträge
1.658
Moin moin,
ich habe wieder einmal eine, größtenteils theoretische, Frage betreffend PHP und MySQL.

In meinem derzeitigem Projekt gibt es eine gewaltige Anzahl von tables die nur mit Daten gefüttert werden wenn so und so viele bedinungen erfüllt sind. Vieles wird von der DB selber mit triggern geprüft. Im programm und allgemein würde ich es aber gerne noch realisieren das nur bestimmte Instanzen einer Klasse eine Table modifizieren können.
Z.B. darf nur ein Objekt der Klasse Mitarbeiter etwas an der table Mitarbeiter ändern. Das PHp technisch zu lösen ist einigermaßen leicht, aber ich kann ja immer noch an Mitarbeiter vorbei ein query an die DB schicken. Genauso kann ich das über phpmyadmin oder über die server shell.
Eine möglichkeit dies zu umgehen wäre z.b. dasjede Klasse nur die berechtigung für seine table bekommt, also es auch dementsprechend viele User geben muss.
Das verhindert aber immer noch nicht das ändern an der Klasse vorbei.
Mir geht es einfach darum absolut sicher zu gehen das keine invaliden Daten in die DB geschrieben werden und so langsam verzweifle ich an MySQL und überlege ernsthaft auf DB2 zu wechseln, auch wenn es sau teuer ist.

Aber würde so etwas theoretisch gehen? Kann man ein programm schreiben das PHP so überwacht und query verhindert die nicht von einer bestimmten Klasse ausgehen?
(Ja man kann fast alles was man sich vorstellen kann, aber mir geht es ehr darum ob da schonmal jemand dran gedacht hat, ob es workarounds gibt oder ob es vlt. doch gar keinen sinn hat)

MFG
Marc
 
Du könntest für jeder Klasse eine db account machen und den entsprechende Rechte einräumen.
Wenn dir mysql zu wenig bietet würde ich an deiner Stelle postgresql anschauen,
schon aus dem Grund weil es immer noch kostenlos ist.
 
ja auf die idee war ich ja auch gekommen, nur wie verhindere ich dann das ich einfach über die shell oder php selber nen query starte?
Meine zweite idee wäre jetzt alles datei basiert zu machen. Es Klasse fragt bei einem Programm nach der Datei und muss sich identifizieren, z.b. durch serilisation von sich selber und bekommt wenn alles stimmt den zugriff. Und die datein sind dann im Programm versteckt sodass nur das programm diese ändern kann, dies erscheint mir aber ein wenig umständlich, wenn auch mit mäßigem aufwand realisierbar. Hab sogar noch nen alten SQL Parser aus der uni hier liegen :p

kann postgresql denn sowas in die richtung? Man müsste ja vermutlich beides, den php interpreter und die DB umschreiben :-/

Wäre auch delüx wenn man Klassen von PHP als User im Linux setzen könnte, quasi mit verschiedenen rechten. Aber ich denke da verschwimmt dann wohl zu sehr die grenze zwischen OS und programm.....
 
Zuletzt bearbeitet:
Das ist kein MySQL-Problem sondern ein "Problem" deines Ansatzes, du versuchst dich vor etwas zu schützen, wovor du dich nicht schützen kannst.
Du kannst nicht sagen, dass nur bestimmter Programmcode X anpassen darf und anderer nur Y, das geht einfach nicht, was du stattdessen brauchst sind "Soft Rules" also einfach eine Konvention, dass man es nicht machen darf, aber absichern dagegen kannst du dich nicht, weder mit MySQL oder PostgreSQL noch DB2 oder Oracle.

Da die Querys über einen Unix/TCP-Socket abgesendet werden, haben sie keinerlei strikte Verbindung zu deinem Programmcode, wo die Socketverbindung herkommt kann eine Datenbank nicht erkennen und nicht reglementieren.
Genauso kann dein "Serialisierungs-Ansatz" umgangen werden in dem Programmcode X sich einfach so verhält wie Programmcode Y und somit doch wieder Zugriff auf Dinge hat, auf die kein Zugriff möglich sein sollte.

Du versuchst ein Problem, welches du hast, entweder falsch anzupacken oder denkst an absolut unmögliche übertriebene "Sicherheitsregeln".

Das Problem steckt in deiner Definition von "invaliden Daten" nur weil Programmcode X etwas in die Tabelle schreibt, was eigentlich Programmcode Y verwaltet, sind die Daten nicht invalid, das sind sie erst, wenn sie gegen Constraints der Datenbank verstoßen, es wird hier einzig und allein die Konvention verletzt wer über was die Kontrolle hat (Ownership).
 
Zuletzt bearbeitet:
Ja sowas dachte ich mir :-/
Einzige lösung wäre also eine art eigene datenbank zu schreiben. mySql unterstützt leider keine constraints ......
Mir geht es auch nicht nur um invalide daten sondern um strikte Datenkapselung. In Java würde ich einfach ein Objekt haben das die Daten verwaltet, aber in PHP liegen diese in der DB und können von überall geändert werden, das geht mir bissl gegen den strich.

Aber wie gesagt es war nur eine rein theoretische frage, du hast mir da schon gut weiter geholfen :)

aber das man sich dagegen gar nicht schützen kann glaube ich nicht, man müsste nur eben alles an seine bedürfnisse anpassen, die Kommunikation muss ja nicht einmal zwingend über Sockets stattfinden.

Und ein zweites Problem was ich habe ist dabei auch folgendes:
Wenn ich ein jetzt ein Objekt Mitarbeiter mit den Daten der Table Mitarbeiter lade und während des bearbeitens ändert jemand die einträge in der DB werden sie anschließend mit meinen neuen Bearbeiteten Daten wieder überschrieben.
Ich habe das so umgangen das auf jeden Datensatz nur einmal zugegriffen werden kann, also es wird ein flag "onUse" gesetzt und dann ist der gesperrt bis er freigegeben wurde oder ein timeout stattfindet.
Vor jedem bearbeiten der Daten diese neu aus der DB zu lesen hat mir zu viel Performance gefressen.
Nachteil dieser methode: Wenn jetzt jemand den Browser beendet bleibt der Datensatz evtl. gesperrt. Ich lasse zwar alles freigeben sobald die Seite geschlossen wird, aber man kann einen Browser ja auch so killen das nicht mal ein onunload aufgerufen werden kann. Und bei wenig Mitarbeitern geht das noch, aber wenn nun 100 Leute an dem Ding sitzen und ständig die meldung bekommen "Zugriff gesperrt von XY" na danke. Eine richtige Client/Server anwendung wäre da echt besser um stets über datenänderungen informiert zu werden.

Threads wären mal eine ideale Erweiterung für PHP und nein ich möchte kein CGI oder perl benutzen. Je mehr ich in PHP mache desto weniger mag ich diese Sprache, Script sprachen machen echt alle unnötig kompliziert.
 
Mercsen schrieb:
aber das man sich dagegen gar nicht schützen kann glaube ich nicht, man müsste nur eben alles an seine bedürfnisse anpassen, die Kommunikation muss ja nicht einmal zwingend über Sockets stattfinden.
dann nenn mir einen sicheren Ansatz.

Mercsen schrieb:
Und ein zweites Problem was ich habe ist dabei auch folgendes:
Wenn ich ein jetzt ein Objekt Mitarbeiter mit den Daten der Table Mitarbeiter lade und während des bearbeitens ändert jemand die einträge in der DB werden sie anschließend mit meinen neuen Bearbeiteten Daten wieder überschrieben.
Ich habe das so umgangen das auf jeden Datensatz nur einmal zugegriffen werden kann, also es wird ein flag "onUse" gesetzt und dann ist der gesperrt bis er freigegeben wurde oder ein timeout stattfindet.
Vor jedem bearbeiten der Daten diese neu aus der DB zu lesen hat mir zu viel Performance gefressen.
Nachteil dieser methode: Wenn jetzt jemand den Browser beendet bleibt der Datensatz evtl. gesperrt. Ich lasse zwar alles freigeben sobald die Seite geschlossen wird, aber man kann einen Browser ja auch so killen das nicht mal ein onunload aufgerufen werden kann. Und bei wenig Mitarbeitern geht das noch, aber wenn nun 100 Leute an dem Ding sitzen und ständig die meldung bekommen "Zugriff gesperrt von XY" na danke. Eine richtige Client/Server anwendung wäre da echt besser um stets über datenänderungen informiert zu werden.
das ist ein typisches "Problem" und du wirst dazu auch viele Lösungsansätze im Internet finden ;)
Es wird auf 3 Lösungen hinauslaufen:
  • Optimistic Concurrency Control
    • jeder darf Daten anpassen, wie er möchte, bei Konflikten bietest du wie bei Wikipedia die Möglichkeit des Mergens an (u.U. viel Arbeit)
  • Pessimistic Concurrency Control
    • du setzt einen Lock für eine Zeitspanne X in der darf wirklich niemand den Datensatz verarbeiten
    • du setzt ein Flag für eine Zeitspanne X und jeder wird informiert, dass jemand gerade schon an dem Datensatz arbeitet (Konfliktlösung: Data Merging, Last Updater Wins, Rollback of last Update)
Du musst ja PHP nicht als alleinige Lösung einsetzen, du kannst ja auch node.js als Beispiel für Comet-Ansätze dazunehmen und um direkte Client-Server-Verbindungen zu ermöglichen.
PHP ist auch nur ein Werkzeug in deinem Werkzeugkasten ;)

Mercsen schrieb:
Threads wären mal eine ideale Erweiterung für PHP und nein ich möchte kein CGI oder perl benutzen. Je mehr ich in PHP mache desto weniger mag ich diese Sprache, Script sprachen machen echt alle unnötig kompliziert.
dann nimm kein PHP, ist doch eine einfache Sache ;)
Threads wurden aus guten Gründen weggelassen, es ist sehr schwer korrekt gethreadete Anwendungen zu schreiben, es gibt nicht ohne Grund Bücher mit mehreren Hundert Seiten nur über korrektes Threading.
 
Zurück
Oben