Hallo Ulli,
Ulli hat geschrieben:Aber was bedeutet "verwundbar für SQL Injection"
http://de.wikipedia.org/wiki/SQL-Injection
Der Trick ist, eben NICHT die Werte / Variablen direkt im ersten Statement unterzubringen, sondern zunächst den allgemeinen Befehl vorzubereiten (bei SQLexpress geht das über die obige Syntax):
Code: Alles auswählen
INSERT INTO Dokumente( DokId,DateiInhalt ) VALUES ( ? , ? )
das so erzeugte Statement, wird dann (mehrfach) ausgeführt, wobei die Daten dann übergeben werden ... hier die ganze SQLexpress Syntax:
Code: Alles auswählen
oStmt:SQLString := 'INSERT INTO MyTable (Field1, Blob2) VALUES (?,?)'
cFile := memoread(cFileName)
oStmt:Execute("Bildname", cFile)
gibt es nicht sowas wie PREPAIR und EXECUTE ?
Was sind BINÄR Daten ...
cFile := MemoRead("MeinFilm.ISO") // solange der Speicher reicht ...
In cFile sind nun alle möglichen Zeichen enthalten, die in Zeichenfeldern als Umlaute, Steuerzeichen, chr(0)=Ende des String interpretiert werden.
Das ist aber für diese Art der Datei völlig inakzeptabel, da ja gerade nur BINÄRE Werte enthalten sind.
Wenn man nun diese Daten in eine Datei speichern will, gibt es Zeichenfelder: DBFDBE Datentypen C, M etc. ein
replace in ein solches Memofeld würde Konvertierungen auslösen (OEM/ANSI), je nach Einstellung.
Also muss man diese Variable mit dem BINÄR Puffer in eine Form umwandeln, die nur "druckbare Zeichen" enthält, HEX nutzt 00 bis FF für jedes Byte, benötigt also doppelten Speicherplatz, aber das ginge:
Code: Alles auswählen
replace TextMemoFeld with Char2Hex( cByteBuffer ) // cByteBuffer hatte z.B. 200 Zeichen, gespeichert werden 400
cByteBuffer := Hex2Char(TextMemoFeld) // liefert den gleichen Inhalt wie die Ausgangsvariable.
replace TextMemoFeld with cByteBuffer // cByteBuffer hatte z.B. 200 Zeichen, gespeichert werden 200, aber eventuelle Konvertierungen werden durchgeführt.
cByteBuffer := TextMemoFeld // liefert einen konvertierten Inhalt, wobei nicht alle Konvertierungen 1:1 rückgängig gemacht werden können und Steuerzeichen könnten den String verkürzt haben.
Bei einem BINÄREN Memofeld wie es die FOXDBE bietet (Memo (binary) "V") kann man direkt schreiben und lesen:
Code: Alles auswählen
replace BinMemoFeld with cByteBuffer // cByteBuffer hatte z.B. 200 Zeichen, gespeichert werden 200
cByteBuffer := BinMemoFeld) // liefert den gleichen Inhalt wie die Ausgangsvariable.
wenn man also die BytePufferVariable einfach als Parameter angibt (ähnlich wie ein Datumswert oder Numerisch) und die Speicherung funktioniert, dann wird intern BINÄR gespeichert.
Wenn es bei Lesen / Schreiben Fehler gibt, dann muss man mit Base64, UUencode, oder HEX codierten Variablen arbeiten.