Eu tenho uma tabela test(id,name)
.
Eu preciso inserir valores como: user's log
, 'my user'
, customer's
.
insert into test values (1,'user's log');
insert into test values (2,''my users'');
insert into test values (3,'customer's');
Estou recebendo um erro se executar alguma das instruções acima.
Se houver algum método para fazer isso corretamente, compartilhe. Não quero nenhuma declaração preparada.
É possível usar o mecanismo de escape do sql?
Respostas:
Literais de string
Escapar aspas simples
'
dobrando-as ->''
é a maneira padrão e funciona, é claro:Nas versões antigas, ou se você ainda executa com
standard_conforming_strings = off
, ou, geralmente, se você anexa sua sequênciaE
para declarar a sintaxe da sequência de escape Posix , também é possível escapar com a barra invertida\
:A barra invertida em si é escapada com outra barra invertida. Mas isso geralmente não é preferível.
Se você precisar lidar com muitas aspas simples ou múltiplas camadas de escape, evite citar o inferno no PostgreSQL com cadeias de caracteres cotadas em dólar :
Para evitar ainda mais confusão entre cotações em dólar, adicione um token exclusivo para cada par:
Que pode ser aninhado em qualquer número de níveis:
Preste atenção se o
$
personagem tiver um significado especial no software cliente. Você pode ter que escapar disso também. Este não é o caso de clientes padrão do PostgreSQL como psql ou pgAdmin.Isso é muito útil para escrever funções plpgsql ou comandos SQL ad-hoc. Ele não pode aliviar a necessidade de usar instruções preparadas ou algum outro método para proteger contra injeção de SQL em seu aplicativo quando a entrada do usuário é possível. A resposta de Craig tem mais sobre isso. Mais detalhes:
Valores dentro do Postgres
Ao lidar com valores dentro do banco de dados, existem algumas funções úteis para citar seqüências de caracteres corretamente:
quote_literal()
ouquote_nullable()
- o último gera a stringNULL
para entrada nula. (Há tambémquote_ident()
a aspas duplas cordas quando necessário para obter SQL válidas identificadores .)format()
com o especificador de formato%L
é equivalente aquote_nullable()
.Gostar:
format('%L', string_var)
ouconcat()
normalmente não são boas, pois elas não escapam de aspas simples e barras invertidas.concat_ws()
fonte
SELECT $outer$OUT$inner$INNER$inner$ER$outer$;
prova que o aninhamento de segundo nível não funciona aqui.São muitos mundos ruins, porque sua pergunta implica que você provavelmente tem buracos de injeção de SQL em seu aplicativo.
Você deve estar usando instruções parametrizadas. Para Java, use
PreparedStatement
com espaços reservados . Você diz que não deseja usar instruções parametrizadas, mas não explica o motivo e, francamente, deve ser uma boa razão para não usá-las, porque elas são a maneira mais simples e segura de corrigir o problema que você está tentando resolver.Consulte Prevenindo a injeção de SQL em Java . Não seja a próxima vítima de Bobby .
Não há função pública no PgJDBC para citação e escape de string. Em parte porque isso pode parecer uma boa ideia.
Não são built-in citando funções
quote_literal
equote_ident
no PostgreSQL, mas eles são paraPL/PgSQL
funções que usamEXECUTE
. Hoje em dia aquote_literal
maioria é obsoleta porEXECUTE ... USING
, que é a versão parametrizada , porque é mais segura e fácil . Você não pode usá-los para a finalidade que você explica aqui, porque são funções do lado do servidor.Imagine o que acontece se você obtiver o valor
');DROP SCHEMA public;--
de um usuário mal-intencionado. Você produziria:que divide em duas declarações e um comentário que é ignorado:
Opa, lá vai o seu banco de dados.
fonte
= ANY(?)
e um parâmetro de matriz.database is accessed by java
que isso aborda diretamente a questão. Também é muito importante que as pessoas que vêm aqui estejam cientes dos perigos em potencial, especialmente porque o SQL Injection é a principal causa de vulnerabilidade de software. Uma vez cientes do problema, as pessoas podem tomar decisões informadas sobre quando isso não importa, como seu caso de uso de inicialização.De acordo com a documentação do PostgreSQL (4.1.2.1. String Constants) :
Consulte também o parâmetro standard_conforming_strings , que controla se o escape com barras invertidas funciona.
fonte
No postgresql, se você deseja inserir valores
'
nele, então, para isso, você deve fornecer'
fonte
você pode usar a função postrgesql chr (int):
fonte
Se você precisar fazer o trabalho na página:
to_json(value)
https://www.postgresql.org/docs/9.3/static/functions-json.html#FUNCTIONS-JSON-TABLE
fonte
format()
,quote_literal()
ouquote_nullable()
para escapar aspas. Veja: stackoverflow.com/a/25143945/939860fonte
user's log
no lugar de formaabc
adequada para começar. Captura 22.