sql >> Database teknologi >  >> RDS >> PostgreSQL

Demonstrer SQL-injektion i PL/pgSQL

SQL-forespørgsler i PL/pgSQL er planlagt som forberedte sætninger. Så længe du kun passerer værdier ligesom du gør, er SQL-injektion generelt umulig . Detaljer:

Brug dynamisk SQL med EXECUTE og uden korrekt parameterhåndtering til faktisk at demonstrere SQL-injektion.

Like (sådan ikke). at gøre 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ørste variabel em er korrekt videregivet med USING klausul som værdi og kan derfor ikke misbruges til SQL-injektion.

Men den anden variabel passwd er ukorrekt sammenkædet uden at undslippe korrekt. Således kan brugerinput konverteres til SQL-kode. SQL-injektion.

Brug aldrig dette! Undtagen når du demonstrerer, hvordan man ikke gør det.

Lignende uheld er muligt, når SQL-strenge sammenkædes forkert i klienten.




  1. Sådan kører du sql-scripts fra en pl sql-procedure

  2. Mysql json datatype count og groupby

  3. Kan jeg redigere mysqli_result-objekt i php?

  4. Navngivning af primærnøgler id vs something_id i SQL