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?
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?
Odpowiedzi:
To zależy.
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.
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:
USING
klauzula. Przykład .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ą:
format()
ze specyfikatorem formatu%I
. Przykład .quote_ident()
. Przykład .regclass
dla nazw tabel: _tbl::regclass
. Przykład .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.
USING
klauzuli, aby przekazywać wartości w EXECUTE
miarę 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ć.