sql >> Database >  >> RDS >> PostgreSQL

Het maken van een trigger voor het invoegen van een onderliggende tabel geeft een verwarrende fout

Uw oplossing corrigeert het doorgeven van de rij-getypte NEW variabel. Je hebt echter een stiekem SQL-injectiegat in je code, dat is bijzonder gevaarlijk in een SECURITY DEFINER functie. Gebruikersinvoer mag nooit worden geconverteerd naar SQL-code zonder escapecodes.

Ontsmet als volgt:

CREATE OR REPLACE FUNCTION trg_test_log()
  RETURNS trigger AS
$$
BEGIN
    EXECUTE 'INSERT INTO public.' || quote_ident('testlog_' || NEW.name)
         || ' SELECT ($1).*'
    USING NEW;

    RETURN NULL;
END
$$
LANGUAGE plpgsql SECURITY DEFINER;

Ook:

  • OLD is niet gedefinieerd in een INSERT trigger.
  • Je hebt geen variabele nodig. Opdrachten zijn relatief duur in plpgsql.


  1. Geen SQL-impasse door ontwerp - enige coderingspatronen?

  2. Sjablonen gebruiken in SQL Server Management Studio (SSMS) - SQL Server / TSQL-zelfstudie, deel 16

  3. Unieke beperking uit MySQL-tabel laten vallen

  4. Een web-app vanaf nul maken met Python Flask en MySQL:deel 4