Tengo una tabla test(id,name)
.
Necesito insertar 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');
Recibo un error si ejecuto alguna de las declaraciones anteriores.
Si hay algún método para hacerlo correctamente, compártelo. No quiero ninguna declaración preparada.
¿Es posible usar el mecanismo de escape sql?
Respuestas:
Literales de cadena
Escapando de comillas simples
'
duplicándolas ->''
es la forma estándar y funciona, por supuesto:En versiones anteriores o si todavía se ejecuta con
standard_conforming_strings = off
o, en general, si antepone su cadenaE
para declarar la sintaxis de cadena de escape de Posix , también puede escapar con la barra invertida\
:La barra diagonal inversa se escapa con otra barra diagonal inversa. Pero eso generalmente no es preferible.
Si tiene que lidiar con muchas comillas simples o múltiples capas de escape, puede evitar citar el infierno en PostgreSQL con cadenas de dólares :
Para evitar aún más la confusión entre las cotizaciones en dólares, agregue un token único a cada par:
Que se puede anidar cualquier cantidad de niveles:
Presta atención si el
$
personaje debe tener un significado especial en el software de tu cliente. Es posible que tenga que escapar además. Este no es el caso con clientes estándar de PostgreSQL como psql o pgAdmin.Todo eso es muy útil para escribir funciones plpgsql o comandos SQL ad-hoc. Sin embargo, no puede aliviar la necesidad de usar declaraciones preparadas o algún otro método para proteger contra la inyección de SQL en su aplicación cuando es posible la entrada del usuario. La respuesta de @ Craig tiene más información al respecto. Más detalles:
Valores dentro de Postgres
Al tratar con valores dentro de la base de datos, hay un par de funciones útiles para citar cadenas correctamente:
quote_literal()
oquote_nullable()
- este último genera la cadenaNULL
para una entrada nula. (También hayquote_ident()
que comillas dobles cadenas donde sea necesario para obtener SQL válidas identificadores .)format()
con el especificador de formato%L
es equivalente aquote_nullable()
.Me gusta:
format('%L', string_var)
oconcat()
normalmente no son buenas, ya que no escapan a comillas simples anidadas y barras diagonales inversas.concat_ws()
fuente
SELECT $outer$OUT$inner$INNER$inner$ER$outer$;
demuestra que el anidamiento de segundo nivel no funciona aquí.Esto es tan malo, porque su pregunta implica que probablemente tenga una gran inyección de SQL agujeros de en su aplicación.
Debería estar usando declaraciones parametrizadas. Para Java, use
PreparedStatement
con marcadores de posición . Dices que no quieres usar declaraciones parametrizadas, pero no explicas por qué , y francamente tiene que ser una muy buena razón para no usarlas porque son la forma más simple y segura de solucionar el problema que estás intentando. resolver.Consulte Prevención de la inyección de SQL en Java . No seas bobby la próxima víctima de .
No hay una función pública en PgJDBC para las citas y escapes de cadenas. Eso se debe en parte a que podría parecer una buena idea.
No son incorporados al citar las funciones
quote_literal
yquote_ident
en PostgreSQL, pero son paraPL/PgSQL
las funciones que utilizanEXECUTE
. En estos díasquote_literal
está obsoleto en su mayoríaEXECUTE ... USING
, que es la versión parametrizada , porque es más segura y fácil . No puede usarlos para el propósito que explica aquí, porque son funciones del lado del servidor.Imagine lo que sucede si obtiene el valor
');DROP SCHEMA public;--
de un usuario malintencionado. Producirías:que se divide en dos declaraciones y un comentario que se ignora:
Vaya, ahí va tu base de datos.
fuente
= ANY(?)
y un parámetro de matriz.database is accessed by java
que esto aborda directamente la pregunta. También es muy importante que las personas que vienen aquí sean conscientes de los peligros potenciales, especialmente dado que la inyección SQL es la causa número 1 de vulnerabilidad de software. Una vez conscientes del problema, las personas pueden tomar decisiones informadas sobre cuándo no importa, como su caso de uso de arranque.De acuerdo con la documentación de PostgreSQL (4.1.2.1. Constantes de cadena) :
Vea también el parámetro standard_conforming_strings , que controla si funciona el escape con barras invertidas.
fuente
En postgresql si desea insertar valores con
'
él, entonces para esto debe dar más'
fuente
puede usar la función postrgesql chr (int):
fuente
Si necesita hacer el trabajo dentro de Pg:
to_json(value)
https://www.postgresql.org/docs/9.3/static/functions-json.html#FUNCTIONS-JSON-TABLE
fuente
format()
,quote_literal()
oquote_nullable()
para escapar de las comillas. Ver: stackoverflow.com/a/25143945/939860fuente
user's log
en lugar deabc
correctamente. Captura 22.