SQL-Injection in Postgres-Funktionen im Vergleich zu vorbereiteten Abfragen

30

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?

mickeyf_supports_Monica
quelle

Antworten:

36

Es hängt davon ab, ob.

SQL-Funktionen

Mit LANGUAGE sqllautet 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.

PL / pgSQL-Funktionen

Mit LANGUAGE plpgsqllautet 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:

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:

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.

Erwin Brandstetter
quelle
Also, zusammenfassend: Wenn 1) ich nur die Sprache sql verwende, bin ich sicher, 2) wenn ich plpgslq verwende, aber nicht ausführe, bin ich sicher, 3) wenn ich plpgsql verwende und ausführe, aber keine Bezeichner und% s oder% L je nach Bedarf bin ich sicher, oder 4) wenn ich plpgsql verwende und und Bezeichner ausführe, aber% I oder quote_ident je nach Bedarf bin ich sicher. Richtig?
Mickeyf_supports_Monica
@ Mickeyf: Grundsätzlich ja. Verwenden Sie außerdem die USINGKlausel, um Werte zu übergeben, EXECUTEwann 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.
Erwin Brandstetter