Ich habe einen Tisch test(id,name)
.
Ich brauche einfügen Werte wie: 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, um dies richtig zu machen, teilen Sie diese bitte mit. Ich möchte keine vorbereiteten Aussagen.
Ist es möglich, einen SQL-Escape-Mechanismus zu verwenden?
Antworten:
String-Literale
Einfache Anführungszeichen
'
durch Verdoppeln zu umgehen ->''
ist die Standardmethode und funktioniert natürlich:In alten Versionen oder wenn Sie immer noch mit
standard_conforming_strings = off
oder im Allgemeinen, wenn Sie Ihre Zeichenfolge voranstellen,E
um die Posix-Escape-String-Syntax zu deklarieren , können Sie auch mit dem Backslash maskieren\
:Der Backslash selbst wird mit einem weiteren Backslash maskiert. Aber das ist im Allgemeinen nicht vorzuziehen.
Wenn Sie sich mit vielen einfachen Anführungszeichen oder mehreren Escape-Ebenen befassen müssen, können Sie vermeiden, die Hölle in PostgreSQL mit Zeichenfolgen in Dollar-Anführungszeichen zu zitieren :
Fügen Sie jedem Paar einen eindeutigen Token hinzu, um Verwechslungen zwischen Dollar-Anführungszeichen zu vermeiden:
Welche kann beliebig viele Ebenen verschachtelt werden:
Achten Sie darauf, ob der
$
Charakter in Ihrer Client-Software eine besondere Bedeutung haben soll. Möglicherweise müssen Sie 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 Antwort hat mehr dazu. Mehr Details:
Werte in Postgres
Beim Umgang mit Werten in der Datenbank gibt es einige nützliche Funktionen, um Zeichenfolgen richtig zu zitieren:
quote_literal()
oderquote_nullable()
- Letzteres gibt die ZeichenfolgeNULL
für die Null-Eingabe aus. (Es gibt auchquote_ident()
zu doppelte Anführungszeichen Strings , wo erforderlich , um gültige SQL zu erhalten Bezeichner .)format()
mit dem Formatbezeichner%L
ist äquivalent zuquote_nullable()
.Mögen:
format('%L', string_var)
oderconcat()
sind normalerweise nicht gut, da diese nicht verschachtelten einfachen Anführungszeichen und Backslashes entgehen.concat_ws()
quelle
SELECT $outer$OUT$inner$INNER$inner$ER$outer$;
beweist aber, dass die Verschachtelung der 2. Ebene hier nicht funktioniert.Dies sind so viele schlechte Welten, weil Ihre Frage impliziert, dass Ihre Anwendung wahrscheinlich klaffende SQL-Injection- Lücken aufweist.
Sie sollten parametrisierte Anweisungen verwenden. Verwenden Sie für Java
PreparedStatement
Platzhalter . 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, da sie der einfachste und sicherste Weg sind, das von Ihnen versuchte Problem zu beheben lösen.Siehe Verhindern der SQL-Injektion in Java . Sei nicht Bobbys nächstes Opfer.
In PgJDBC gibt es keine öffentliche Funktion zum Zitieren und Escapezeichen von Zeichenfolgen. Das liegt zum Teil daran, dass es eine gute Idee sein könnte.
Es gibt integrierte Anführungszeichenfunktionen
quote_literal
undquote_ident
PostgreSQL, diese gelten jedoch fürPL/PgSQL
Funktionen, die verwendet werdenEXECUTE
. Diese Tagequote_literal
werden meistens vonEXECUTE ... USING
der parametrisierten Version überholt , weil sie sicherer und einfacher ist . Sie können sie nicht für den hier erläuterten Zweck verwenden, 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:Das besteht aus zwei Aussagen und einem Kommentar, der ignoriert wird:
Hoppla, da geht deine Datenbank.
quelle
= ANY(?)
einen Array-Parameter verwenden.database is accessed by java
dass dies die Frage direkt anspricht . Es ist auch sehr wichtig, dass die Leute, die hierher kommen, auf die potenziellen Gefahren aufmerksam gemacht werden, insbesondere angesichts der Tatsache, dass SQL Injection die häufigste Ursache für Software-Schwachstellen ist. Sobald Sie sich des Problems bewusst sind, können Sie fundierte Entscheidungen treffen, wann es keine Rolle spielt, wie z. B. Ihren Bootstrapping-Anwendungsfall.Gemäß der PostgreSQL-Dokumentation (4.1.2.1. String-Konstanten) :
Siehe auch den Parameter standard_conforming_strings , der steuert, ob das Escapezeichen mit Backslashes funktioniert.
quelle
Wenn Sie in postgresql Werte einfügen möchten,
'
müssen Sie dafür extra angeben'
quelle
Sie können die Funktion postrgesql chr (int) verwenden:
quelle
Wenn Sie die Arbeit in Seite erledigen müssen:
to_json(value)
https://www.postgresql.org/docs/9.3/static/functions-json.html#FUNCTIONS-JSON-TABLE
quelle
format()
,quote_literal()
oderquote_nullable()
Anführungszeichen zu entkommen. Siehe: stackoverflow.com/a/25143945/939860quelle
user's log
anstelle vonabc
richtig zu zitieren . Fang 22.