Jest tak wiele złych światów, ponieważ twoje pytanie sugeruje, że prawdopodobnie masz luki w aplikacjach SQL .
Powinieneś używać sparametryzowanych instrukcji. W przypadku języka Java należy używać PreparedStatementsymboli zastępczych . Mówisz, że nie chcesz używać sparametryzowanych instrukcji, ale nie wyjaśniasz dlaczego , i szczerze mówiąc, musi to być bardzo dobry powód, aby ich nie używać, ponieważ są one najprostszym i najbezpieczniejszym sposobem rozwiązania problemu, który próbujesz rozwiązać rozwiązać.
Zobacz Zapobieganie wstrzykiwaniu SQL w Javie . Nie bądź Bobby kolejną ofiarą .
W PgJDBC nie ma funkcji publicznej do cytowania ciągów i zmiany znaczenia. Po części dlatego, że może to wydawać się dobrym pomysłem.
Tam są wbudowane w cytując funkcje quote_literali quote_identw PostgreSQL, ale są za PL/PgSQLjego pomocą funkcji EXECUTE. Te dni quote_literalsą w większości przestarzałe EXECUTE ... USING, ponieważ jest to sparametryzowana wersja , ponieważ jest bezpieczniejsza i łatwiejsza . Nie możesz ich użyć do celów, które tu 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. Wyprodukowalibyście:
insert into test values (1,'');DROP SCHEMA public;--');
który dzieli się na dwie instrukcje i komentarz, który jest ignorowany:
insert into test values (1,'');
DROP SCHEMA public;
--');
Ups, tam idzie twoja baza danych.