Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TQuery.open führt DDL-/DML-Anweisung aus (https://www.delphipraxis.net/73131-tquery-open-fuehrt-ddl-dml-anweisung-aus.html)

thlicht 12. Jul 2006 21:47

Datenbank: Oracle XE • Zugriff über: BDE

TQuery.open führt DDL-/DML-Anweisung aus
 
Hallo zusammen,

mein erster Beitrag und ein wirklicher Hammer. Ich habe eine Anwendung (D5 Enterprise), die auf eine Oracle-XE-DB zugreift und aus einer Textdatei eine Query lädt und diese mit Open öffnet. Also ein einfaches Tool, um flexibel Auswertungen zu erstellen.

Wenn meine Textdatei nun Datenmanipluationen (DML) oder gar Datendefinitionen (DDL) enthält, werden diese auf dem Server ausgeführt, bevor Delhi mir in einer Fehlermeldung mitteilt, dass es keinen Cursor erzeugen konnte. Nicht gerade lustig, wenn in der Textdatei so was wie "drop table ..." steht. Die Auswertungen sollen vom Admin meines Kunden selbst erstellt werden, und so mancher Bastler könnte da auf dumme Ideen kommen.

Auch der Versuch, DB.Readonly:=true zu setzen, bringt keine Änderung.

Wie schaffe ich es, Änderungen an der Datenbank zu unterdrücken?

Danke

mkinzler 12. Jul 2006 21:50

Re: TQuery.open führt DDL-/DML-Anweisung aus
 
-Benutzerrechte beschränken (kein GRANT)
-Abfragen vorher parsen

thlicht 12. Jul 2006 22:05

Re: TQuery.open führt DDL-/DML-Anweisung aus
 
Das grundsätzlich Beschränken der Rechte ist nur schwer möglich, da die angemeldeten User an anderer Stelle natürlich Datenänderungen vornehmen dürfen. Ich hatte auch schon überlegt, das Abfragemodul unter einem besodneren User-Account laufen zu lassen und diesem die Rechte zu beschneiden. Ist aber etwas wenig elegant.

Parsen ist auch möglich, nur sind es eben doch eine ganze Menge Begriffe die auszufiltern sind. Wenn man das richtig macht, müsste man sogar den Context bewerten. Ich denke, wenn es keinen besseren Weg gibt, werde ich wohl diesen wählen.

Ich hatte aber gehofft, dass die BDE irgendwie eine Klassifikation des Befehls (z.B. beim Prepare) vornehmen kann (wäre dort natürlich auch sowas wie parsen) und mir diese stupide Arbeit abnimmt. Schaun wir mal ...

mkinzler 12. Jul 2006 22:20

Re: TQuery.open führt DDL-/DML-Anweisung aus
 
Ein TQuery kennt zwar die Eigenschaft .Prepare, ich versteh aber nicht ganz wie dir das bei deinem Problem helfen soll. Prepare überträgt zwar die Abfrage, bereitet sie vor und führt sie nicht gleich aus, aber wenn der Anwender "Drop ..." eingibt wird sie trotzdem ausgeführt.

BTW. Warum nimmst du die BDE für Oracle ?

thlicht 12. Jul 2006 22:39

Re: TQuery.open führt DDL-/DML-Anweisung aus
 
Ja, mit dem PREPARE das war nur eine Idee in der Hoffung, jemand nimmt mir die Arbeit einer Analyse der SQL-Anweisung ab. Der Vorschlag war nciht wirklich qualifiziert, gebe ich gerne zu. I

BDE nehme ich aus historischen Gründen. Die ersten Zeilen der Anwendung sind vor ca 10 Jahren entstanden. Bete von Windows-Version zu Version, dass die BDE noch läuft. Kennst Du eine Alternative, die eine wirklich fette Applikation mit vielen Querys und StoredProc mit vertretbarem Aufwand von BDE migrieren läßt (und vielleicht noch mein eigentliches aktuelles Problem lösen kann)?
Danke

mkinzler 12. Jul 2006 22:47

Re: TQuery.open führt DDL-/DML-Anweisung aus
 
Alle auf TDataSet basierenden Komponenten funktionieren ähnlich wie die BDE. Aber natürlich hast du immer einen Migrationsaufwand. Aber der Einsatz der BDE schränkt die Fähigkeiten neuer DBMS stark ein. Schon deswegen sollte man nach Alternativen Ausschau halten. Wie z.B. OCI, ZEOS, AnyDAC, ODAC, ADO, ...

thlicht 12. Jul 2006 22:54

Re: TQuery.open führt DDL-/DML-Anweisung aus
 
Ok, ich sehe, dass ich da wohl mit BDE nicht weiterkommen. Werde mir bei Gelegeheit mal die Alternative ansehen.
Dank dir für die schnelle Hilfe. Werde den Case schließen.

Gute nacht

Bernhard Geyer 13. Jul 2006 07:26

Re: TQuery.open führt DDL-/DML-Anweisung aus
 
Der Vorschlag von mkinzler ist schon der richtige: Du solltest den "normalen" Usern auf der DB kein DDL-Rechte geben. Eintrag/Löschen von Datensätzen sind wieder andere Rechte (DML) die du unabhängig davon einstellen kannst.

Wie schaut denn eine Textdatei aus? Ich vermute du kannst den Vorschlag mit alternativen Komponenten um dieses Problem zu lösen vergessen da du vermutlich ein gewaltiges Sicherheitloch im Bezug auf SQL-Injection besitzt.

mkinzler 13. Jul 2006 07:51

Re: TQuery.open führt DDL-/DML-Anweisung aus
 
Meine Vorschlag zum Kompo-Wechsel war auch unabhängig von diesem Problem zu verstehen, da sie es ja auch nicht lösen können, sondern auf Grund der Tatsache das mit der BDE ein Großteil der Fähigkeiten von Oracle halt nicht zur Verfügung stehen.

mikhal 13. Jul 2006 11:51

Re: TQuery.open führt DDL-/DML-Anweisung aus
 
Warum legst du nicht ein Schema auf deiner Oracle-Datenbank an, in dem ausschließlich Views angelegt werden (vom Admin oder anderen berechtigten Personen) und läßt in deiner Applikation nur den Select auf diese Views zu?

Ggf. mit einem kleinen Dialog zur Übergabe von Parametern.

Grüße
mikhal


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:31 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz