sql >> Databáze >  >> RDS >> PostgreSQL

Ukažte vkládání SQL v PL/pgSQL

SQL dotazy v PL/pgSQL jsou plánovány jako připravené příkazy. Dokud předáváte pouze hodnoty stejně jako vy je injekce SQL obecně nemožná . Podrobnosti:

Použijte dynamické SQL s EXECUTE a bez správného zpracování parametrů, které by skutečně demonstrovaly vkládání SQL.

Jako (takto ne udělat to!):

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;

První proměnná em je správně předán s USING klauzule jako hodnota a nelze je tedy zneužít pro vkládání SQL.

Ale druhá proměnná passwd je nesprávně zřetězen, aniž by správně unikal. Vstup uživatele tak lze převést na kód SQL. SQL injection.

Toto nikdy nepoužívejte! Kromě předvádění, jak to nedělat.

Podobná neplecha je možná při nesprávném zřetězení SQL řetězců v klientovi.




  1. Připojte se k MySQL DB pomocí multi-threadingu

  2. PHP – Není bezpečné spoléhat se na systémové nastavení časového pásma

  3. Hibernate generování dvou různých sekvenčních ID pro vložení PostgreSQL

  4. MySQL je nyní() +1 den