Jedes Mal, wenn Sie eine SQL-Zeichenfolge erstellen, indem Sie Zeichenfolgen miteinander verketten, besteht die Gefahr eines Injektionsangriffs, unabhängig davon, wie sicher der Zugriff auf diese Zeichenfolgen ist. Nach allem, was Sie wissen, könnte jemand Ihre App in einem Debugger ausführen, setzen Sie einen Haltepunkt auf das Ergebnis QuotedStr()
, und ändern Sie den Inhalt vor dem Erlauben Format()
, es zu sehen.
Die Verwendung von SQL-Parametern ist der sicherste Weg. Es vermeidet nicht nur Injektionen, sondern erlaubt auch der SQL-Engine, zu entscheiden, wie die Parameter am besten für ihre eigenen Bedürfnisse formatiert werden, so dass Sie sich keine Gedanken über die Formatierung der Werte in Ihrem eigenen Code machen müssen Sprachen (wie Delphi). Ganz zu schweigen von den Leistungsvorteilen, die es ermöglichen, die SQL-Anweisung auf der Serverseite im Voraus vorzubereiten, bevor sie dann in Ihrem Code mehrfach ausgeführt wird, wodurch der Datenverkehr zwischen Client und Server drastisch reduziert und die Gesamtleistung erhöht wird.
var
sCustomer : string
begin
AdoSql.CommandText := 'Select SUM(value) result from invoices where customer=:Customer';
AdoSql.Prepared := True;
...
AdoSql.Parameters['Customer'].Value := sCustomer;
AdoSql1.ExecSQL;
...
AdoSql.Parameters['Customer'].Value := sCustomer;
AdoSql1.ExecSQL;
...
AdoSql.Prepared := False;
end;
Ich denke, Titel sollte 'QuotedStr Funktion vs Parameter in SQL-Injektionen Szenarien?' Aber ändern, wird hier einige Antworten brechen. Das * Problem * hier ist über 'QuotedStr' und nicht' Format'. – kobik