Sind in Postgres vorbereitete Abfragen und benutzerdefinierte Funktionen gleichbedeutend mit einem Mechanismus zum Schutz vor SQL-Injection ?
Gibt es besondere Vorteile bei einem Ansatz gegenüber dem anderen?
Sind in Postgres vorbereitete Abfragen und benutzerdefinierte Funktionen gleichbedeutend mit einem Mechanismus zum Schutz vor SQL-Injection ?
Gibt es besondere Vorteile bei einem Ansatz gegenüber dem anderen?
Antworten:
Es hängt davon ab, ob.
Mit LANGUAGE sql
lautet die Antwort in der Regel ja .
Übergebene Parameter werden als Werte behandelt und SQL-Injection ist nicht möglich - solange Sie keine unsicheren Funktionen aus dem Body aufrufen und Parameter übergeben.
Mit LANGUAGE plpgsql
lautet die Antwort normalerweise ja .
Jedoch ermöglicht PL / pgSQL für dynamischen SQL in den übergebenen Parameter (oder Teile) werden zu einem Query - String verkettet und ausgeführt mit EXECUTE
. Dies kann Benutzereingaben in SQL-Code konvertieren und SQL-Injection ermöglichen . Von außen ist nicht erkennbar, ob der Funktionskörper damit richtig umgeht. Werkzeuge werden zur Verfügung gestellt.
Verwenden Sie dynamisches SQL nur dort, wo Sie es benötigen. Einfache SQL-Anweisungen, die Parameter als Werte verwenden, sind wie SQL-Funktionen gegen SQL-Injection sicher.
Übergeben Sie für dynamisches SQL vorzugsweise Werte als Werte mit:
USING
Klausel. Beispiel .Macht SQL-Injection grundsätzlich unmöglich.
Wenn Sie Werte in der SQL-Zeichenfolge verketten , verwenden Sie Folgendes :
Bricht Zeichenfolgen sicher in einfache Anführungszeichen ein , wodurch Syntaxfehler und SQL-Injection vermieden werden.
Prozessparameter, die als Bezeichner in der SQL-Zeichenfolge behandelt werden sollen, mit:
format()
mit Formatbezeichner%I
. Beispiel .quote_ident()
. Beispiel .regclass
für Tabellennamen: _tbl::regclass
. Beispiel .Schließt Zeichenfolgen bei Bedarf sicher in doppelte Anführungszeichen ein , um Syntaxfehler und SQL-Injection zu vermeiden.
Verbunden:
Erstellen Sie niemals nur eine Zeichenfolge aus Benutzereingaben und führen Sie sie aus. Dies schließt Bezeichner ein, die direkt von einem Benutzer übergeben oder aus einem Systemkatalog abgerufen werden. Alle müssen wie Benutzereingaben behandelt und beim Erstellen von dynamischem SQL sicher zitiert werden!
Weitere Informationen zu den Auswirkungen auf die Leistung finden Sie in dieser Antwort:
Grundlagen zur SQL-Injection:
Ähnliche Überlegungen gelten für andere serverseitige Sprachen , die dynamisches SQL ermöglichen.
USING
Klausel, um Werte zu übergeben, EXECUTE
wann immer dies möglich ist. Sie können eine PL / pgSQL-Funktion aus einer SQL-Funktion heraus aufrufen und Parameter übergeben. Um absolut korrekt zu sein, sind Sie sicher, solange Sie keine unsicheren Funktionen direkt oder indirekt aufrufen. Wenn alle Ihre Funktionen ordnungsgemäß ausgeführt wurden, kann dies nicht passieren.