Moin!
Hallo!
Zunächst einmal bin ich einwenig verwirrt.
Wenn ich einer Klasse Zugriffsrechte auf bestimmte Tabellen vergeben möchte, halte ich das zunächst erstmal nicht für "irrsinning" sondern innerhalb eines bestimmten framesets sogar für sinnvoll.
Deswegen habe ich ja schon ganz zu Beginn gefragt, warum du das tun willst...
In dem Fall hat das wohl auch eher weniger mit dem Schutz vor SQL-Injection zu tun. Da habe ich mich wohl sehr ungeschickt ausgedrückt. In dem Fall geht es eher um die allgemeine Zugriffsberechtigung auf bestimmte Tabellen.
Das war deine erste Äußerung zu dem Grund deines Handelns.
Und wenn die propagierte Lösung ein "Nimm reguläre Ausdrücke" ist, dann lautet die Antwort darauf "Fail!". Weil das nicht funktionieren kann.
Was Zugriffsberechtigungen angeht, sieht die Welt anders aus. Aber auch dort sind reguläre Ausdrücke nicht wirklich brauchbar, aus denselben gründen, wie sie bei SQL-Injection nicht brauchbar sind.
Gegen welches Szenario willst du dich schützen? Ein interner Programmierer wird, wenn er Code schreibe, die mit der Datenbank Kontakt aufnimmt, vermutlich nicht freiwillig beliebig wilde Tabellen befragen, sondern nur diejenigen, die für seine Aufgabe relevant sind. Mit anderen Worten: Wenn er drei Tabellen braucht, fragt er drei Tabellen ab. Wenn dazu notwendig ist, diese drei Tabellen noch irgendwo anzumelden, damit dein Prüfmechanismus den Zugriff erlaubt, wird er diese Information mit Copy&Paste auch dort noch eintragen.
Sollte er später feststellen, dass er weitere zwei Tabellen braucht, wird er die zwei Tabellen nachtragen, und dein Prüfmechanismus wird es erlauben.
Und was bringt das dann? Soweit erstmal nichts, außer einem überflüssigen Aufwand für den Programmierer, der diese Prüfroutine bedienen muss.
Der einfachere Weg wäre für ihn, den Query einfach direkt abzuschicken, ohne deinen Code zu benutzen. Kannst du das verhindern? Vermutlich nicht.
Ich löse es jetzt so, dass ich eine eigene select-Funktion schreibe welche vor der prepare-Funktion aufgerufen werden muss.
Wie schon gefragt: Was soll diese Funktion tun?
Danke an ms88aut für den Denkanstoß der mir gefehlt hat!
Ein Denkanstoß, der das gewünschte Ziel verfehlt, weil das Ziel nicht formuliert war, ist ein schlechter Denkanstoss.
- Sven Rautenberg