AGB  ·  Datenschutz  ·  Impressum  







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

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, 13: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, 13: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.660 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 19. Jan 2011, 13: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 13:46 Uhr)
  Mit Zitat antworten Zitat
Bernerbaer
(Gast)

n/a Beiträge
 
#4

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

  Alt 19. Jan 2011, 13: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
 
#5

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

  Alt 19. Jan 2011, 14: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
685 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 19. Jan 2011, 15: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
taveuni

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

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

  Alt 19. Jan 2011, 13: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
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 18:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz