AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Parameterverwendung bei DB-, Feld- und Tabellennamen

Parameterverwendung bei DB-, Feld- und Tabellennamen

Ein Thema von freejay · begonnen am 14. Jan 2016 · letzter Beitrag vom 15. Jan 2016
Antwort Antwort
Seite 2 von 3     12 3   
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#11

AW: Parameterverwendung bei DB-, Feld- und Tabellennamen

  Alt 14. Jan 2016, 16:23
Ääähhhh, sorry für meine Unwissenheit, aber wenn auf der Clientseite der Tabellenname mit einem Macro ersetzt wird, kann es doch trotzdem noch zu SQL Injection kommen!?
Ja, davon gehe ich aus. Aber erstens war das mit dem Tabellennamen nur ein in meiner Praxis nicht vorkommendes Beispiel und zweitens ging es mir zusätzlich um einen "objektmäßigeren" Code - also nicht immer diese String-/Format-Pfriemeleien - auch wenn SQL natürlich per se eher textlastig is...

Die Benutzung von Parametern verhindert allerdings meines Wissens nach sicher SQL-Injections.
Wir haben und da mal eine Klasse TSQL gebastelt, mit der man auf Basis einer Stringliste SQL-Statements zusammen bauen konnte. "Add" wurde als Property realisiert, damit man auf die Klammern verzichten konnte, das machte das im Quelltext lesbarer. Gleichzeitig gab es diverse Hilfsfunktionen für verschiedene Datenbanken. Dabei ging es hauptsächlich um das angenehme, lesbare zusammenbauen der SQL-Statements, ein paar Sachen waren drin um SQL-Injektion zu verhindern, es wurde aber trotzdem auch mit Parametern gearbeitet:

Delphi-Quellcode:
function SQL_Beispiel:String;
var s:TSQL;
begin
  s:=TSQL.Create;
  s.Add := 'Select';
  s.Add := ' Wert1,';
  s.Add := ' Wert2,';
  s.Add := ' Wert3';
  s.Add := 'From';
  s.Add := ' Tabelle';
  s.Add := 'Where';
  s.Add := ' Wert4 = ' + s.oracleStr('Suchstring'); // sowas wie QuotedStr
  s.Add := ' and Wert5 > ' + s.oracleDateOfStr('01.12.2015'); // würde zu To_Date('01.12.2015','dd.mm.yyyy')
  Result:=s.Text;
  //s.Show //zum Anzeigen des Statements in einem Memo eines kleinen Popup-Forms.
  s.Free;
end;
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.980 Beiträge
 
Delphi 12 Athens
 
#12

AW: Parameterverwendung bei DB-, Feld- und Tabellennamen

  Alt 14. Jan 2016, 16:57
Wir haben und da mal eine Klasse TSQL gebastelt, mit der man auf Basis einer Stringliste SQL-Statements zusammen bauen konnte. "Add" wurde als Property realisiert, damit man auf die Klammern verzichten konnte, das machte das im Quelltext lesbarer.
Das würde man heute auch mit einer bordeigenen TStringList vielleicht sogar noch etwas eleganter hinkriegen:
Delphi-Quellcode:
type
  TOracleHelper = class helper for TStrings
  public
    function oracleStr(const value: string): string;
    function oracleDateOfStr(const value: string): string;
  end;

function SQL_Beispiel: String;
var
  s: TStringList;
begin
  s := TStringList.Create;
  try
    s.AddStrings([
       'Select',
       ' Wert1,',
       ' Wert2,',
       ' Wert3',
       'From',
       ' Tabelle',
       'Where',
       ' Wert4 = ' + s.oracleStr('Suchstring'),
       ' and Wert5 > ' + s.oracleDateOfStr('01.12.2015')
       ]);
    Result := s.Text;
  finally
    s.Free;
  end;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#13

AW: Parameterverwendung bei DB-, Feld- und Tabellennamen

  Alt 15. Jan 2016, 10:12
Im alten D6 geht das so glaub ich leider noch nicht. Auch fehlen der Stringlist ja die schönen Umwandelfunktionen. Wobei man die in dem Beispiel gezeigten ja auch nicht wirklich braucht, wenn man stattdessen mit Parametern arbeitet, insofern kann man sich bei neueren Delphis durchaus die Mühe einer eigenen Klasse sparen.

Nur aus Neugier:
Wie funktiert das eigentlich mit dem Datum als Parameter, wenn man das gewohnte deutsche Datumsformat im String hat "15.03.2013" die Datenbank aber intern mit US-Schema arbeitet?
Ralph

Geändert von Jumpy (15. Jan 2016 um 10:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#14

AW: Parameterverwendung bei DB-, Feld- und Tabellennamen

  Alt 15. Jan 2016, 10:37
Nur aus Neugier:
Wie funktiert das eigentlich mit dem Datum als Parameter, wenn man das gewohnte deutsche Datumsformat im String hat "15.03.2013" die Datenbank aber intern mit US-Schema arbeitet?
Überlass doch der Datenbank die Speicherung...

Code:
MyQuery.SQL.Text := 'SELECT * FROM :TabName;';
MyQuery.ParamByName('TabName').AsString := TabellenName;
MyQuery.Open;
Fast... Beispiel INSERT mit Datum

Delphi-Quellcode:
MyQuery.SQL.Text := 'INSERT INTO FooTable (FooDate,FooStr,FooInt) VALUES (:1,:2,:3);';
MyQuery.Params[0].AsDateTime := NOW; // Funktioniert nur, wenn FooDate in der Datenbank ein DateTime-Feld ist.
MyQuery.Params[1].AsString := 'Die Frage aller Fragen:';
MyQuery.Params[2].AsInteger := 42;

Mavarik

Oder war das nicht die Frage?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.980 Beiträge
 
Delphi 12 Athens
 
#15

AW: Parameterverwendung bei DB-, Feld- und Tabellennamen

  Alt 15. Jan 2016, 10:58
Im alten D6 geht das so glaub ich leider noch nicht.
Das wir die eigentliche Intention meines Beitrags

Auch fehlen der Stringlist ja die schönen Umwandelfunktionen.
Das wiederum wollte ich mit dem Class helper demonstrieren.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming

Geändert von Uwe Raabe (15. Jan 2016 um 11:16 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#16

AW: Parameterverwendung bei DB-, Feld- und Tabellennamen

  Alt 15. Jan 2016, 13:17
Auch fehlen der Stringlist ja die schönen Umwandelfunktionen.
Das wiederum wollte ich mit dem Class helper demonstrieren.
Aua. Den Teil deines Beitrages habe einfach überlesen und bei "function SQL_Beispiel: String;" angefangen den Code zu lesen. So macht das natürlich mehr Sinn, sorry.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.980 Beiträge
 
Delphi 12 Athens
 
#17

AW: Parameterverwendung bei DB-, Feld- und Tabellennamen

  Alt 15. Jan 2016, 13:19
Im Gegenteil! Das gab mir die Gelegenheit, das nochmal herauszustellen
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#18

AW: Parameterverwendung bei DB-, Feld- und Tabellennamen

  Alt 15. Jan 2016, 13:24
Oder war das nicht die Frage?
Doch, nur machst du es dir mit NOW() einfach. Wie sieht es bei einem Datum, dass mir im Programm als String vorliegt aus? Muss da Delphi die Umwandlung machen?

Delphi-Quellcode:
MyQuery.Params[0].AsDateTime := StrToDatetime('15.03.2013'); //?? Da müssen aber die FormatSettingspassen oder?

MyQuery.Params[0].AsString := '15.03.2013'; //Was müsste wo eingestellt werden, damit das klappt?
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.980 Beiträge
 
Delphi 12 Athens
 
#19

AW: Parameterverwendung bei DB-, Feld- und Tabellennamen

  Alt 15. Jan 2016, 13:34
Delphi-Quellcode:
MyQuery.Params[0].AsDateTime := StrToDatetime('15.03.2013'); //?? Da müssen aber die FormatSettingspassen oder?

MyQuery.Params[0].AsString := '15.03.2013'; //Was müsste wo eingestellt werden, damit das klappt?
Mit der Zuweisung As<Type> wird der Datentyp des Parameters festgelegt. Mit AsString wird also ein (Wide-)String-Parameter gesetzt, was hier aber wohl nicht gewünscht ist. AsDateTime wäre hier der korrekte Ansatz.

Was die FormatSettings anbelangt: Die können bei einem aktuelleren Delphi als zweiter Parameter an StrToDateTime mitgegeben werden (TFormatSettings.Invariant).

Wenn das Datum nicht als String, sondern als Werte für Tag, Monat und Jahr vorliegt, geht auch ein EncodeDate.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#20

AW: Parameterverwendung bei DB-, Feld- und Tabellennamen

  Alt 15. Jan 2016, 13:58
MyQuery.Params[0].AsDateTime := '20.01.2016' Geht übrigens nicht.
  Mit Zitat antworten Zitat
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 16:07 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