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ć PreparedStatement
symboli 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_literal
i quote_ident
w PostgreSQL, ale są za PL/PgSQL
jego pomocą funkcji EXECUTE
. Te dni quote_literal
są 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.