Estou tentando entender as implicações de marcar uma função PostgreSQL como LEAKPROOF. Digamos que temos uma configuração de aplicativo da web (inquilino único), que é Navegador -> Servidor (Django, Rails, etc.) -> PostgreSQL. O servidor é o único que tem acesso ao PostgreSQL, o único que pode adicionar consultas de execução, executar funções, etc.
O servidor tenta consultar uma tabela no esquema público chamado foo
. A tabela é apenas uma chave primária, id
e um jsonb
campo,, bar
com 100.000 linhas. O jsonb
campo possui um índice GIN. Quando a segurança em nível de linha não é aplicada, qualquer ->
consulta bar
usa o índice GIN perfeitamente. No entanto, quando a segurança em nível de linha é aplicada, a segurança em nível de linha força uma varredura de sequência. Este é um "problema" conhecido, conforme abordado aqui , aqui , etc.
Depois de ler a documentação do PostgreSQL e vários posts, tenho dificuldade em ver o risco de substituir a jsonb
operação de filtro por um equivalente LEAKPROOF. Eu sei que a documentação diz que poderia "vazar" informações, mas em uma configuração de locatário único, para quem isso estaria vazando? O servidor pode filtrar quaisquer mensagens de erro para o cliente e o próprio servidor é uma entidade confiável.
Uma função pode vazar informações para o usuário que a está chamando, se operar em dados que o usuário não tem permissão para acessar. Esse vazamento pode ser uma mensagem de erro: “Recebo um erro de divisão por zero, então deve haver zero em algum lugar”. Agora
->
não há esse erro, mas você pode provar que um usuário inteligente não consegue vazar informações sobre o JSON em que está operando?Se o seu servidor e aplicativo forem totalmente seguros, você não precisará de nenhuma segurança extra. Portanto, é melhor não usar segurança em nível de linha, mas usar
WHERE
condições explícitas sempre que apropriado. Admiro sua confiança na perfeição de sua aplicação.Se você quer segurança, terá que pagar o preço pela segurança. Usar um recurso de segurança como segurança em nível de linha e desarmá-lo marcando funções aleatórias é
LEAKPROOF
um exercício tolo.