J'ai une table test(id,name)
.
Je dois insérer des valeurs comme: 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');
Je reçois une erreur si j'exécute l'une des instructions ci-dessus.
S'il existe une méthode pour le faire correctement, veuillez la partager. Je ne veux pas de déclarations préparées.
Est-il possible d'utiliser le mécanisme d'échappement sql?
Réponses:
Littéraux de chaîne
Échapper aux guillemets simples
'
en les doublant ->''
est la méthode standard et fonctionne bien sûr:Dans les anciennes versions ou si vous exécutez toujours avec
standard_conforming_strings = off
ou, généralement, si vous ajoutez votre chaîne àE
pour déclarer la syntaxe de chaîne d'échappement Posix , vous pouvez également vous échapper avec la barre oblique inverse\
:La barre oblique inverse elle-même est échappée avec une autre barre oblique inverse. Mais ce n'est généralement pas préférable.
Si vous devez gérer de nombreux guillemets simples ou plusieurs couches d'échappement, vous pouvez éviter de citer l'enfer dans PostgreSQL avec des chaînes entre guillemets :
Pour éviter davantage la confusion entre les cotations en dollars, ajoutez un jeton unique à chaque paire:
Qui peuvent être imbriqués dans n'importe quel nombre de niveaux:
Faites attention si le
$
personnage doit avoir une signification particulière dans votre logiciel client. Vous devrez peut-être y échapper en plus. Ce n'est pas le cas avec les clients PostgreSQL standard comme psql ou pgAdmin.Tout cela est très utile pour écrire des fonctions plpgsql ou des commandes SQL ad hoc. Cependant, cela ne peut pas réduire le besoin d'utiliser des instructions préparées ou une autre méthode pour se protéger contre l'injection SQL dans votre application lorsque l'entrée utilisateur est possible. @ La réponse de Craig en contient plus. Plus de détails:
Valeurs à l'intérieur de Postgres
Lorsque vous traitez des valeurs à l'intérieur de la base de données, il existe quelques fonctions utiles pour citer correctement les chaînes:
quote_literal()
ouquote_nullable()
- ce dernier sort la chaîneNULL
pour une entrée nulle. (Il y a aussiquote_ident()
de guillemets doubles cordes si nécessaire pour obtenir valides SQL identifiants .)format()
avec le spécificateur de format%L
est équivalent àquote_nullable()
.Comme:
format('%L', string_var)
ou neconcat()
sont généralement pas bons car ceux-ci n'échappent pas aux guillemets simples et aux barres obliques inverses imbriqués.concat_ws()
la source
SELECT $outer$OUT$inner$INNER$inner$ER$outer$;
prouve que l'imbrication de 2ème niveau ne fonctionne pas ici.?C'est tellement de mondes mauvais, car votre question implique que vous avez probablement des trous d' injection SQL béants dans votre application.
Vous devez utiliser des instructions paramétrées. Pour Java, utilisez
PreparedStatement
avec des espaces réservés . Vous dites que vous ne voulez pas utiliser des instructions paramétrées, mais vous n'expliquez pas pourquoi , et franchement, cela doit être une très bonne raison de ne pas les utiliser car elles sont le moyen le plus simple et le plus sûr de résoudre le problème que vous essayez résoudre.Voir Prévention de l'injection SQL en Java . Ne soyez pas la prochaine victime de Bobby .
Il n'y a pas de fonction publique dans PgJDBC pour la citation de chaîne et l'échappement. C'est en partie parce que cela pourrait donner l'impression que c'est une bonne idée.
Il existe des fonctions de citation intégrées
quote_literal
etquote_ident
dans PostgreSQL, mais elles sont destinées auxPL/PgSQL
fonctions qui utilisentEXECUTE
. Ces jours-ciquote_literal
sont principalement obsolètes parEXECUTE ... USING
, qui est la version paramétrée , car elle est plus sûre et plus facile . Vous ne pouvez pas les utiliser aux fins que vous expliquez ici, car ce sont des fonctions côté serveur.Imaginez ce qui se passe si vous obtenez la valeur
');DROP SCHEMA public;--
d'un utilisateur malveillant. Vous produiriez:qui se décompose en deux déclarations et un commentaire qui est ignoré:
Oups, voilà votre base de données.
la source
= ANY(?)
un paramètre de tableau.database is accessed by java
que cela répond directement à la question. Il est également très important que les personnes venant ici soient sensibilisées aux dangers potentiels, d'autant plus que l'injection SQL est la première cause de vulnérabilité logicielle. Une fois conscients du problème, les gens peuvent prendre des décisions éclairées quant au moment où cela n'a pas d'importance, comme votre cas d'utilisation d'amorçage.Selon la documentation PostgreSQL (4.1.2.1. Constantes de chaîne) :
Voir aussi le paramètre standard_conforming_strings , qui contrôle si l'échappement avec des barres obliques inverses fonctionne.
la source
Dans postgresql si vous voulez insérer des valeurs avec,
'
vous devez donner plus'
la source
vous pouvez utiliser la fonction postrgesql chr (int):
la source
Si vous devez faire le travail à l'intérieur de Pg:
to_json(value)
https://www.postgresql.org/docs/9.3/static/functions-json.html#FUNCTIONS-JSON-TABLE
la source
format()
,quote_literal()
ouquote_nullable()
pour échapper des guillemets. Voir: stackoverflow.com/a/25143945/939860la source
user's log
à la place deabc
correctement pour commencer. Catch 22.