Insérer du texte avec des guillemets simples dans PostgreSQL

J’ai un test(id,name) table test(id,name) .

Je dois insérer des valeurs telles que: user's log , 'my user' , le 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 je lance l’une des déclarations ci-dessus.

S’il y a une méthode pour le faire correctement, veuillez partager. Je ne veux pas de déclarations préparées.

Est-il possible d’utiliser un mécanisme d’échappement SQL?

Echapper aux guillemets simples en les doublant -> est la méthode standard et fonctionne bien sûr.

 'user's log' -- incorrect syntax (unbalanced quote) 'user''s log' 

Dans les anciennes versions ou si vous exécutez toujours standard_conforming_ssortingngs = off ou, en général, si vous ajoutez votre chaîne avec E pour déclarer la syntaxe d’échappement Posix , vous pouvez également vous échapper avec la barre oblique inverse \ :

 E'user\'s log' 

Mais ce n’est généralement pas préférable.
Si vous devez gérer plusieurs guillemets simples ou plusieurs couches d’échappement, vous pouvez éviter de citer hell dans PostgreSQL avec des chaînes libellées en dollars :

 'escape '' with ''''' $$escape ' with ''$$ 

Pour éviter toute confusion entre les guillemets, ajoutez un jeton unique à chaque paire:

 $token$escape ' with ''$token$ 

Qui peut être nested n’importe quel nombre de niveaux:

 $token2$Inner ssortingng: $token1$escape ' with ''$token1$ is nested$token2$ 

Faites attention si le caractère $ doit avoir une signification particulière dans votre logiciel client. Vous devrez peut-être y échapper. Ce n’est pas le cas avec les clients PostgreSQL standard tels que psql ou pgAdmin.

C’est très utile pour écrire des fonctions plpgsql ou des commandes SQL ad hoc. Il ne peut pas alléger le besoin d’utiliser des instructions préparées ou une autre méthode pour éviter l’injection SQL dans votre application lorsque la saisie de l’utilisateur est possible. @ La réponse de Craig a plus à ce sujet. Plus de détails:

  • Injection SQL dans les fonctions Postgres vs requêtes préparées

Il y a tant de mondes de mauvais, car votre question implique que vous avez probablement des trous d’ injection SQL béants dans votre application.

Vous devriez 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 constituent le moyen le plus simple et le plus sûr de résoudre le problème. 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 les guillemets et les échappements. C’est en partie parce que cela pourrait sembler une bonne idée.

Il existe des fonctions de guillemets intégrées quote_literal et quote_ident dans PostgreSQL, mais elles sont destinées PL/PgSQL fonctions PL/PgSQL qui utilisent EXECUTE . Ces jours, quote_literal est la plupart du temps obsolète par EXECUTE ... USING , qui est la version paramétrée , parce que c’est plus sûr et plus facile . Vous ne pouvez pas les utiliser dans le but 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:

 insert into test values (1,'');DROP SCHEMA public;--'); 

qui se décompose en deux déclarations et un commentaire qui est ignoré:

 insert into test values (1,''); DROP SCHEMA public; --'); 

Oups, il va votre firebase database.

Selon la documentation de PostgreSQL (4.1.2.1. Constantes de chaîne) :

  To include a single-quote character within a ssortingng constant, write two adjacent single quotes, eg 'Dianne''s horse'. 

Voir aussi le paramètre standard_conforming_ssortingngs , qui contrôle si l’échappement avec des barres obliques inverses fonctionne.

En postgresql si vous voulez insérer des valeurs avec ' dedans alors vous devez donner plus '

  insert into test values (1,'user''s log'); insert into test values (2,'''my users'''); insert into test values (3,'customer''s'); 

vous pouvez utiliser la fonction postrgesql chr (int):

 insert into test values (2,'|| chr(39)||'my users'||chr(39)||'); 

Si vous avez besoin de faire le travail dans Pg:

to_json(value)

https://www.postgresql.org/docs/9.3/static/functions-json.html#FUNCTIONS-JSON-TABLE