Это очень много плохих миров, потому что ваш вопрос подразумевает, что у вас, вероятно, есть пробелы в SQL-инъекциях в вашем приложении.
Вы должны использовать параметризованные операторы. Для Java используйте PreparedStatement
с заполнителями . Вы говорите, что не хотите использовать параметризованные операторы, но не объясняете почему , и, честно говоря, это должно быть очень веской причиной, чтобы не использовать их, потому что это самый простой и безопасный способ решения проблемы, которую вы пытаетесь решить. решать.
См. Предотвращение внедрения SQL в Java . Не будь следующей жертвой Бобби .
В PgJDBC нет публичной функции для цитирования строк и экранирования. Это отчасти потому, что это может показаться хорошей идеей.
Есть и встроенные функции цитирования quote_literal
и quote_ident
в PostgreSQL, но они предназначены для PL/PgSQL
функций, которые используют EXECUTE
. Эти дни quote_literal
в основном устарели EXECUTE ... USING
, что является параметризованной версией , потому что это безопаснее и проще . Вы не можете использовать их для целей, которые вы здесь объясняете, потому что они являются функциями на стороне сервера.
Представьте, что произойдет, если вы получите значение ');DROP SCHEMA public;--
от злонамеренного пользователя. Вы бы произвели:
insert into test values (1,'');DROP SCHEMA public;--');
который разбивается на два утверждения и комментарий, который игнорируется:
insert into test values (1,'');
DROP SCHEMA public;
--');
Упс, там идет ваша база данных.