PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Zademonstruj wstrzyknięcie SQL w PL/pgSQL

Zapytania SQL w PL/pgSQL są planowane jak przygotowane instrukcje. O ile przekazujesz tylko wartości tak jak Ty, wstrzykiwanie SQL jest generalnie niemożliwe . Szczegóły:

Użyj dynamicznego SQL z EXECUTE i bez odpowiedniej obsługi parametrów, aby zademonstrować wstrzykiwanie SQL.

Lubię (w ten sposób nie to zrobić!):

CREATE OR REPLACE FUNCTION login_v(em varchar, passwd varchar)
  RETURNS SETOF users AS
$func$
BEGIN
   RETURN QUERY EXECUTE
        'SELECT *
         FROM   users
         WHERE  email = $1
         AND    encrypted_password = crypt(''' || passwd || ''', encrypted_password)'
   USING em;
END
$func$  LANGUAGE plpgsql;

Pierwsza zmienna em jest prawidłowo przekazany z USING klauzula jako wartość i dlatego nie może być nadużywany do wstrzykiwania SQL.

Ale druga zmienna passwd jest niewłaściwie połączony bez poprawnej ucieczki. W ten sposób dane wprowadzone przez użytkownika można przekonwertować na kod SQL. Wstrzyknięcie SQL.

Nigdy tego nie używaj! Z wyjątkiem demonstracji, jak tego nie robić.

Podobna szkoda jest możliwa w przypadku nieprawidłowego łączenia ciągów SQL w kliencie.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Literały łańcuchowe i znaki ucieczki w postgresql

  2. PostgreSQL:czas utworzenia tabeli

  3. Zarejestruj się i uruchom PostgreSQL 9.0 jako usługę Windows

  4. W jaki sposób zaplecze pamięci masowej wpływa na Datomic?

  5. Podziel ciąg z dwoma ogranicznikami i typ konwersji