sql >> Databasteknik >  >> RDS >> PostgreSQL

Demonstrera SQL-injektion i PL/pgSQL

SQL-frågor i PL/pgSQL planeras som förberedda satser. Så länge du bara klarar värden precis som du gör är SQL-injektion i allmänhet omöjlig . Detaljer:

Använd dynamisk SQL med EXECUTE och utan korrekt parameterhantering för att faktiskt demonstrera SQL-injektion.

Gilla (så här inte). att göra det!):

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;

Den första variabeln em skickas korrekt med USING sats som värde och kan därför inte missbrukas för SQL-injektion.

Men den andra variabeln passwd är felaktigt sammanlänkade utan att korrekt fly. Således kan användarinmatning konverteras till SQL-kod. SQL-injektion.

Använd aldrig detta! Förutom när man visar hur man inte gör det.

Liknande ofog är möjligt när SQL-strängar sammanfogas på felaktigt sätt i klienten.




  1. Ersätt kommatecken med nyrad och skriv till textfil

  2. Hur ordnar mysql rader med samma värde?

  3. MySQL - Supertyp/Subtypdesign

  4. Ett annat UnicodeEncodeError när du använder pandas-metoden to_sql med MySQL