O PostgreSQL é altamente extensível e você pode, por exemplo, definir sua própria linguagem procedural para escrever funções.
O PostgreSQL não sabe nada sobre a linguagem exceto que tem que chamar um certo manipulador de linguagem para executar a função.
A maneira que foi escolhida para implementar isso é simplificar a passagem do código como uma string.
Este é apenas um detalhe de implementação e não torna as funções do PostgreSQL mais ou menos vulneráveis à injeção de SQL do que outros RDBMS.
Existem vários níveis em que você deve se defender contra a injeção:
-
Os argumentos da função:Aqui você deve escolher tipos de dados não string sempre que possível.
-
As instruções SQL dentro da função:Aqui você deve evitar SQL dinâmico sempre que possível, e se você tiver que usar SQL dinâmico, você deve inserir variáveis usando o%L
padrão doformat
função.
Novamente, isso é o mesmo se os corpos das funções forem especificados como strings ou não.