Це дуже багато поганих світів, тому що ваше запитання означає, що у вашій програмі, ймовірно, у вас є розбіжні отвори для ін'єкцій 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;
--');
Ну, там іде ваша база даних.