AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken INSERT kann mit einem Open ausgeführt werden?
Thema durchsuchen
Ansicht
Themen-Optionen

INSERT kann mit einem Open ausgeführt werden?

Ein Thema von dust258 · begonnen am 19. Jan 2011 · letzter Beitrag vom 20. Jan 2011
Antwort Antwort
dust258

Registriert seit: 18. Aug 2008
62 Beiträge
 
#1

INSERT kann mit einem Open ausgeführt werden?

  Alt 19. Jan 2011, 14:27
Datenbank: Firebird • Version: 2.1 • Zugriff über: BDE
Ich arbeite an einem kleinen Modul für meine Applikation, die es dem User erlauben soll, kleine SQL-Statements (nur SELECT) zu schreiben um sich eigene Auswertungen anzeigen zu lassen.

Nach dem TQuery.Open werden die Ergebnisse dann in einem TDBGrid angezeigt. Das Problem ist, das der User einfach Insert oder Update-Befehle eigeben kann, und so die Daten manipuliert.

Nachdem z.B. ein INSERT-Statement mit open ausgefüht wurde, wird wie zu erwarten eine Exception ausgefüht (Keine Daten in der Datenbank).
Aber mit dem nächsten ExecSQL (welches ich im OnClose des Formulars aufrufe), wird das zuvor fehlerhaft ausgeführte SQL-Statement ausgeführt. (und die Daten in die Datenbank eingetragen).

Bei meinen Direkt-Komponenten (DevArt) hat mir folgende Lösung geholfen:
Delphi-Quellcode:
  try
    query.Open;
  except
    on e : Exception do
    begin
      query.Transaction.Rollback;
      MessageDLG(e.Message,mtError,[mbOK],0);
    end;
  end;
In der TQuery gibt es den Punkt Transaction aber nicht. Kennt Jemand von euch vielleicht das Problem?
  Mit Zitat antworten Zitat
Bernerbaer
(Gast)

n/a Beiträge
 
#2

AW: INSERT kann mit einem Open ausgeführt werden?

  Alt 19. Jan 2011, 14:41
Variante 1: Erstelle Views und lasse dem User nur auf diese zugreifen.

Variante 2: überprüfe vor dem Open den vom User zusammengestellten SQL-Syntax auf das Vorhandensein von alter, insert, update und verhindere die Ausführung wenn einer dieser Begriffe vorkommt.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#3

AW: INSERT kann mit einem Open ausgeführt werden?

  Alt 19. Jan 2011, 14:43
Zu Variante 2: wieso nicht einfach nur SELECT als erstes Wort zulassen? Ansonsten müsste man auf jedes Wort achten, das zur Manipulation dient (CREATE und DROP fehlen in Deiner Auflistung z.B.)
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (19. Jan 2011 um 14:46 Uhr)
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
533 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: INSERT kann mit einem Open ausgeführt werden?

  Alt 19. Jan 2011, 14:45
Ist das auch so wenn Du die Query dynamisch erzeugst?
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
Bernerbaer
(Gast)

n/a Beiträge
 
#5

AW: INSERT kann mit einem Open ausgeführt werden?

  Alt 19. Jan 2011, 14:49
Zu Variante 2: wieso nicht einfach nur SELECT als erstes Wort zulassen?
weil ich viel zu weit gedacht habe (gleichzeitiges vorkommen von select und insert in einer Abfrage) und das Einfachste mir nicht in den Sinn gekommen ist.
Ansonsten müsste man auf jedes Wort achten, das zur Manipulation dient (CREATE und DROP fehlen in Deiner Auflistung z.B.)
stimmt!

Wobei ich persönlich doch die Variante 1 vorziehen würde mit den Views und einer sauberen Benutzerzugriffsregelung.
  Mit Zitat antworten Zitat
dust258

Registriert seit: 18. Aug 2008
62 Beiträge
 
#6

AW: INSERT kann mit einem Open ausgeführt werden?

  Alt 19. Jan 2011, 15:10
@taveuni: Ja, macht keinen Unterschied

Hab ich mir fast gedacht. Views kommen für mich leider nicht in Frage, da die Datenstruktur fehlt. Also werde ich wohl vor dem Open parsen.
@DeddyH: Die Idee ist super, nur leider sind in meinem Fall auch mehrere SQL-Befehle hintereinander möglich, daher werde ich wohl nach "verbotenen" Wörtern suchen. Hier meine Lösung:

Delphi-Quellcode:
function TListStatSchnittForm.SucheManipulativeAbfragen(inSSQLText: String): Boolean;
var
  lSSQLxStrings : String;
  lBInString : Boolean;
  i : integer;
begin
  Result := false;

  //Schlüsselwörter in Strings werden ignoriert
  lBInString := false;
  for I := 0 to Length(inSSQLText) - 1 do
  begin
    if (inSSQLText[i] = '"') then
      lBInString := not lBInString;
    if not lBInString then
      lSSQLxStrings := lSSQLxStrings + inSSQLText[i];
  end;

  if (pos('INSERT', Uppercase(lSSQLxStrings)) > 0) or
     (pos('UPDATE', Uppercase(lSSQLxStrings)) > 0) or
     (pos('DROP', Uppercase(lSSQLxStrings)) > 0) or
     (pos('CREATE', Uppercase(lSSQLxStrings)) > 0) or
     (pos('ALTER', Uppercase(lSSQLxStrings)) > 0) or
     (pos('DELETE', Uppercase(lSSQLxStrings)) > 0)
  then
  Result := true;
end;
Edit: Danke für die Hilfe ^^
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
679 Beiträge
 
Delphi 12 Athens
 
#7

AW: INSERT kann mit einem Open ausgeführt werden?

  Alt 19. Jan 2011, 16:38
lass dies von der Datenbank überwachen: lege dazu einen User an, der nur lesend auf die entsprechenden Tabellen zugreifen darf. Logge dich für dein 'benutzer darf SQL eingeben' Fenster über eine zusätzliche Connection mit eben diesem User (oder einem frei zu wählenden) an. Falls dann der Admin Sch... baut und dem falschen Benutzer zuviele Rechte vergibt, ist es nicht mehr dir anzulasten
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#8

AW: INSERT kann mit einem Open ausgeführt werden?

  Alt 19. Jan 2011, 18:47
Hallo,

joachimd hat absolut Recht! Fange auf keine Fall an, solche Spielereien einzubauen!

Sofern ich deinen Code richtig verstanden habe, kann ich deinen Code mit einem einfachen Leerzeichen vor dem "INSERT" aushebeln. Daneben gibt es noch weitere Möglichkeiten wie GRANT oder SET PASSWORD.

Einen read-only Benutzer zu erstellen sollte vom Aufwand nur unwesentlich ins Gewicht fallen, ist in Sachen Sicherheit aber wohl am einfachsten und besten. Achte aber auch hier darauf, dass der Benutzer auch nur die Spalten lesen kann die er lesen darf. Willst du beispielsweise unterbinden, dass ein Nutzer Passwörter auslesen kann, indem du einfach nur die gewünschten Spalten in eine Tabelle ausgibst, so ist dies genauso einfach über SELECT password AS username zu erreichen.

Liebe Grüße,
Valentin
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: INSERT kann mit einem Open ausgeführt werden?

  Alt 19. Jan 2011, 21:03
Wenn die Beschränkung reicht, dass nur eine Abfrage ausgeführt werden kann,
dann führe das einfach so aus:

Code:
query.SQL.Text := 'SELECT * FROM ( ' + Memo.Lines.Text + ' ) AS UserQuery';
Aber erkläre mir doch bitte mal, warum du beim FormClose ein ExecSQL ausführst?
Das macht in meinen Augen irgendwie keinen Sinn.

Und wieso dir eine Transaction da helfen soll, ist mir auch nicht klar.
Das scheint mir alles ein wenig am Thema vorbei
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
dust258

Registriert seit: 18. Aug 2008
62 Beiträge
 
#10

AW: INSERT kann mit einem Open ausgeführt werden?

  Alt 20. Jan 2011, 13:25
@joachimd: Die Struktur ist leider vorgegeben (Das Programm arbeitet mit multiplen Datenbanken)

@Valle: Nein, ein einfaches "Leerzeichen vor dem "INSERT"" hebelt nichts aus

@Sir Rufo: Das würde die Befehle zu sehr einschränken. Und das ExecSQL wird im OnDestroy aufgerufen in einer Query der Benutzerkontensteuerung

Eine eigene Transaktion würde mein Problem sicher auch beheben...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:24 Uhr.
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