Wstrzyknięcie SQL w funkcjach Postgres a przygotowane zapytania

30

Czy w Postgres przygotowane zapytania i funkcje zdefiniowane przez użytkownika są równoważne jako mechanizm zabezpieczający przed wstrzyknięciem SQL ?
Czy są jakieś zalety jednego podejścia względem drugiego?

mickeyf_supports_Monica
źródło

Odpowiedzi:

36

To zależy.

Funkcje SQL

Dzięki LANGUAGE sql, odpowiedź jest zazwyczaj tak .

Przekazane parametry są traktowane jako wartości, a wstrzyknięcie SQL nie jest możliwe - o ile nie wywołuje się niebezpiecznych funkcji z treści i nie przekazuje parametrów.

Funkcje PL / pgSQL

Dzięki LANGUAGE plpgsql, odpowiedź jest zazwyczaj tak .

Jednak PL / pgSQL pozwala na dynamiczny SQL, w którym przekazywane parametry (lub części) są łączone z ciągiem zapytania i wykonywane za pomocą EXECUTE. To może konwertować dane wprowadzone przez użytkownika do kodu SQL i sprawia, że SQL injection to możliwe . Nie można stwierdzić z zewnątrz, czy ciało funkcji odpowiednio go obsługuje. Narzędzia są dostarczane.

Używaj dynamicznego SQL tylko tam, gdzie go potrzebujesz. Proste instrukcje SQL wykorzystujące parametry jako wartości są bezpieczne przed wstrzyknięciem SQL, podobnie jak funkcje SQL.

W przypadku dynamicznego SQL najlepiej przekazać wartości jako wartości z:

Uniemożliwia iniekcję SQL dla zleceniodawcy.

Jeśli konkatenujesz wartości w ciągu SQL, użyj:

Bezpiecznie zawija łańcuchy w pojedyncze cudzysłowy , unikając w ten sposób błędów składniowych i wstrzykiwania SQL.

Parametry procesu, które należy traktować jako identyfikatory ciągu SQL za pomocą:

W razie potrzeby bezpiecznie umieszcza łańcuchy w podwójnych cudzysłowach , unikając w ten sposób błędów składniowych i wstrzykiwania SQL.

Związane z:

Nigdy nie buduj łańcucha na podstawie danych wprowadzonych przez użytkownika i nie wykonuj go. Obejmuje to identyfikatory przekazane bezpośrednio przez użytkownika lub pobrane z katalogu systemowego. Wszystkie muszą być traktowane jak dane wejściowe użytkownika i bezpiecznie cytowane podczas budowania dynamicznego SQL!

Więcej informacji na temat wpływu na wydajność w tej pokrewnej odpowiedzi:

Podstawy wstrzykiwania SQL:

Podobne uwagi dotyczą innych języków po stronie serwera, które umożliwiają dynamiczny SQL.

Erwin Brandstetter
źródło
Podsumowując: jeśli 1) używam tylko języka sql, jestem bezpieczny, 2) jeśli używam plpgslq, ale nie wykonuję, jestem bezpieczny, 3) jeśli używam plpgsql i wykonuję, ale nie ma identyfikatorów i% s lub% L odpowiednio jestem bezpieczny, lub 4) jeśli używam plpgsql i wykonuję i identyfikatory, ale odpowiednio% I lub quote_ident jestem bezpieczny. Poprawny?
mickeyf_supports_Monica
@mickeyf: Zasadniczo tak. Ponadto użyj USINGklauzuli, aby przekazywać wartości w EXECUTEmiarę możliwości. Państwo mogłoby wywołać funkcję PL / PGSQL od wewnątrz funkcji SQL i przekazać parametry. Tak więc, aby być absolutnie poprawnym, jesteś bezpieczny, dopóki nie wywołujesz żadnych niebezpiecznych funkcji bezpośrednio lub pośrednio. Jeśli wszystkie funkcje są wykonane poprawnie, to nie może się zdarzyć.
Erwin Brandstetter,