Äää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;