AGB  ·  Datenschutz  ·  Impressum  







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

Parameterverwendung bei DB-, Feld- und Tabellennamen

Ein Thema von freejay · begonnen am 14. Jan 2016 · letzter Beitrag vom 15. Jan 2016
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von joachimd
joachimd

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

AW: Parameterverwendung bei DB-, Feld- und Tabellennamen

  Alt 14. Jan 2016, 13:15
Äää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!? Oder ist die Macro-Funktion schlau genug, das zu erkennen?
Falls nicht würde ich den eingegebenen Text anhand von System-Tabellen verifizieren
(gibt es eine Tabelle, dessen Text gleich ist wie der eingegebene) und es dann wie im Usprungspost selbst ersetzen.
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Parameterverwendung bei DB-, Feld- und Tabellennamen

  Alt 14. Jan 2016, 14:16
Äää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!? Oder ist die Macro-Funktion schlau genug, das zu erkennen?
Das kann ich aufgrund fehlender Einblicke in die MyDAC-Sourcen nicht beurteilen (also ebenso unwissend), aber der Einwand ist natürlich durchaus berechtigt. Zumindest kann man vorher überprüfen, ob der in das Makro einzusetzende Wert die Vorgaben für einen validen Bezeichner erfüllt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
273 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Parameterverwendung bei DB-, Feld- und Tabellennamen

  Alt 14. Jan 2016, 14:36
Äää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.
[Delphi 11.3.1 Enterprise; Win10/11; MySQL; VCL]
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.877 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Parameterverwendung bei DB-, Feld- und Tabellennamen

  Alt 14. Jan 2016, 14:47
Wenn diese vom DBMS direkt unterstützt werden und nicht von der Zugriffsschicht emuliert werden.
Markus Kinzler
  Mit Zitat antworten Zitat
Jumpy

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

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

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

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.740 Beiträge
 
Delphi 6 Enterprise
 
#7

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.154 Beiträge
 
Delphi 10.3 Rio
 
#8

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
Jumpy

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

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

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

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
Antwort Antwort
Seite 1 von 2  1 2      


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 06:48 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