Wstaw tekst z pojedynczymi cudzysłowami w PostgreSQL
Mam tabelę test(id,name)
.
Muszę wstawić wartości takie jak: 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');
Dostaję błąd, jeśli uruchamiam którąkolwiek z powyższych instrukcji.
Jeśli istnieje jakakolwiek metoda, aby to zrobić poprawnie, podziel się. Nie chcę żadnych przygotowanych oświadczeń.
Czy jest to możliwe przy użyciu mechanizmu ucieczki sql?
6 answers
Unikanie pojedynczych cudzysłowów '
przez podwojenie ich - > ''
jest standardowym sposobem i działa oczywiście.
'user's log' -- incorrect syntax (unbalanced quote)
'user''s log'
W starych wersjach lub jeśli nadal uruchamiasz z standard_conforming_strings = off
lub, ogólnie, jeśli poprzedzasz swój łańcuch E
aby zadeklarować Posix escape string syntax , możesz również uciec z odwrotnym ukośnikiem \
:
E'user\'s log'
Ale to na ogół nie jest lepsze.
Jeśli masz do czynienia z wieloma pojedynczymi cytatami lub wieloma warstwami ucieczki, możesz uniknąć cytowania piekło w PostgreSQL z Dolar-cytowane ciągi:
'escape '' with '''''
$$escape ' with ''$$
Aby jeszcze bardziej uniknąć nieporozumień między notowaniami dolarowymi, dodaj unikalny token do każdej pary:
$token$escape ' with ''$token$
Które można zagnieżdżać dowolną liczbę poziomów:
$token2$Inner string: $token1$escape ' with ''$token1$ is nested$token2$
Zwróć uwagę, czy znak $
powinien mieć specjalne znaczenie w oprogramowaniu klienta. Być może będziesz musiał uciec. Nie jest tak w przypadku standardowych klientów PostgreSQL, takich jak psql czy pgAdmin.
To wszystko jest bardzo przydatne do pisania funkcji plpgsql lub poleceń ad-hoc SQL. Nie może to jednak złagodzić konieczności używania preparowanych instrukcji lub innej metody w celu zabezpieczenia przed iniekcją SQL w Twojej aplikacji, gdy wprowadzanie danych przez użytkownika jest możliwe. @Craig ' s answer ma więcej na ten temat. Więcej szczegółów:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-19 15:43:10
To jest tak wiele złych światów, ponieważ twoje pytanie sugeruje, że prawdopodobnie masz otwory SQL injection w swojej aplikacji.
Powinieneś używać sparametryzowanych instrukcji. Dla Javy, użyj PreparedStatement
with placeholders . Mówisz, że nie chcesz używać sparametryzowanych wyrażeń, ale nie wyjaśniasz dlaczego i szczerze mówiąc, to musi być bardzo dobry powód, aby ich nie używać, ponieważ są najprostszym i najbezpieczniejszym sposobem rozwiązania problemu, który próbujesz rozwiązać rozwiąż.
Zobacz zapobieganie wstrzykiwaniu SQL w Javie . Nie bądź kolejną ofiarą Bobby'ego.
W PgJDBC nie ma publicznej funkcji do cytowania łańcuchów i interpretacji znaków. Po części dlatego, że może to wydawać się dobrym pomysłem.
Istnieją wbudowane funkcje cytowania quote_literal
i quote_ident
w PostgreSQL, ale są one dla PL/PgSQL
funkcji, które używają EXECUTE
. Obecnie {[3] } jest w większości przestarzały przez EXECUTE ... USING
, czyli sparametryzowaną wersję , bo to jest bezpieczniejsze i łatwiejsze. Nie możesz ich używać do celów, które tutaj wyjaśnisz, ponieważ są to funkcje po stronie serwera.
Wyobraź sobie, co się stanie, jeśli otrzymasz wartość ');DROP SCHEMA public;--
od złośliwego użytkownika. Produkowałbyś:
insert into test values (1,'');DROP SCHEMA public;--');
Który dzieli się na dwa stwierdzenia i komentarz, który jest ignorowany:
insert into test values (1,'');
DROP SCHEMA public;
--');
UPS, twoja baza danych.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-07 11:56:49
Zgodnie z dokumentacją PostgreSQL (4.1.2.1. Stałe Łańcuchowe):
To include a single-quote character within a string constant, write two
adjacent single quotes, e.g. 'Dianne''s horse'.
Zobacz także parametr standard_conforming_strings , który kontroluje, czy działa funkcja ucieczki z odwrotnymi ukośnikami.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-07 11:51:16
W postgresql jeśli chcesz wstawić do niego wartości z '
to w tym celu musisz podać dodatkowe '
insert into test values (1,'user''s log');
insert into test values (2,'''my users''');
insert into test values (3,'customer''s');
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-07 20:44:21
Możesz użyć funkcji postrgesql chr (int):
insert into test values (2,'|| chr(39)||'my users'||chr(39)||');
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-29 10:00:36
Jeśli musisz wykonać pracę wewnątrz Pg:
to_json(value)
Https://www.postgresql.org/docs/9.3/static/functions-json.html#FUNCTIONS-JSON-TABLE
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-18 17:01:02