it-swarm.com.de

Fügen Sie Text mit einfachen Anführungszeichen in PostgreSQL ein

Ich habe eine Tabelle test(id,name).

Ich muss folgende Werte einfügen: 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');

Ich erhalte eine Fehlermeldung, wenn ich eine der oben genannten Anweisungen ausführe.

Wenn es eine Methode gibt, die dies korrekt macht, teilen Sie uns dies bitte mit. Ich möchte keine vorbereiteten Aussagen.

Ist es möglich, SQL-Fluchtmechanismus zu verwenden?

350
MAHI

Einfache Anführungszeichen _'_ durch Verdoppeln -> _''_ sind die Standardmethode und funktionieren natürlich.

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

In alten Versionen oder wenn Sie immer noch mit standard_conforming_strings = off ausführen oder wenn Sie Ihrer Zeichenfolge im Allgemeinen E voranstellen, umPosix-Escapezeichenfolge zu deklarieren Syntaxkönnen Sie auch mit dem Backslash _\_ umgehen:

_E'user\'s log'
_

Aber das ist im Allgemeinen nicht vorzuziehen.
Wenn Sie mit vielen einfachen Anführungszeichen oder mehreren Escape-Ebenen zu tun haben, können Sie vermeiden, die Hölle in PostgreSQL mit in Dollar angegebene Zeichenfolgen zu zitieren =:

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

Um weitere Verwechslungen zwischen Dollar-Anführungszeichen zu vermeiden, fügen Sie jedem Paar einen eindeutigen Token hinzu:

_$token$escape ' with ''$token$
_

Welches kann eine beliebige Anzahl von Ebenen verschachtelt werden:

_$token2$Inner string: $token1$escape ' with ''$token1$ is nested$token2$
_

Achten Sie darauf, ob das Zeichen _$_ in Ihrer Client-Software eine besondere Bedeutung haben soll. Möglicherweise müssen Sie es zusätzlich entkommen. Dies ist bei Standard-PostgreSQL-Clients wie psql oder pgAdmin nicht der Fall.

Dies ist alles sehr nützlich, um plpgsql-Funktionen oder Ad-hoc-SQL-Befehle zu schreiben. Es kann jedoch nicht die Notwendigkeit verringern, vorbereitete Anweisungen oder eine andere Methode zum Schutz vor SQL-Injection in Ihrer Anwendung zu verwenden, wenn Benutzereingaben möglich sind. @ Craig's answer hat mehr dazu. Mehr Details:

638

Das sind so viele schlimme Welten, weil Ihre Frage impliziert, dass Sie wahrscheinlich klaffende SQL-Injection Löcher in Ihrer Anwendung haben.

Sie sollten parametrisierte Anweisungen verwenden. Verwenden Sie für Java PreparedStatement mit Platzhaltern . Sie sagen, Sie möchten keine parametrisierten Anweisungen verwenden, aber Sie erklären nicht , warum , und ehrlich gesagt muss es ein sehr guter Grund sein, sie nicht zu verwenden, weil sie sind Der einfachste und sicherste Weg, um das zu lösende Problem zu beheben.

Siehe Verhindern von SQL Injection in Java . Sei nicht das nächste Opfer von Bobby .

In PgJDBC gibt es keine öffentliche Funktion zum Zitieren und Escapieren von Zeichenfolgen. Das liegt zum Teil daran, dass es so aussehen könnte, als wäre es eine gute Idee.

Es gibt eingebaute Anführungszeichenfunktionen quote_literal und quote_ident in PostgreSQL, aber sie sind für PL/PgSQL Funktionen, die EXECUTE verwenden. . Heutzutage wird quote_literal größtenteils durch EXECUTE ... USING veraltet, was die parametrisierte Version ist, weil es sicherer ist und einfacher . Sie können sie nicht für den Zweck verwenden, den Sie hier erläutern, da es sich um serverseitige Funktionen handelt.


Stellen Sie sich vor, was passiert, wenn Sie den Wert ');DROP SCHEMA public;-- von einem böswilligen Benutzer erhalten. Sie würden produzieren:

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

das setzt sich aus zwei Anweisungen und einem Kommentar zusammen, der ignoriert wird:

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

Ups, da ist deine Datenbank.

42
Craig Ringer

Gemäß PostgreSQL-Dokumentation (4.1.2.1. String-Konstanten) :

 To include a single-quote character within a string constant, write two 
 adjacent single quotes, e.g. 'Dianne''s horse'.

Siehe auch den Parameter standard_conforming_strings , mit dem gesteuert wird, ob das Escape mit Backslashes funktioniert.

17
Claudix

Wenn Sie in postgresql Werte mit ' einfügen möchten, müssen Sie hierfür zusätzlich ' angeben.

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

sie können die Funktion postgresql chr (int) verwenden:

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

Wenn Sie die Arbeit in Pg erledigen müssen:

to_json(value)

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

2
hatenine