Экранирование переменных Java для сериализации инструкции SQL в строку

#java #sqlite #ignite #database-backups #change-data-capture

Вопрос:

У нас есть система событий, создающая события базы данных для сбора данных об изменениях.

Система отправляет событие, содержащее инструкцию INSERT или UPDATE с ? заполнителями и массивом упорядоченных значений, соответствующих каждому вопросительному знаку.

Я хочу использовать это для часового резервного копирования файлов, поэтому, если я получу такое заявление, как:

insert into T0(a,b,c) VALUES(?,?,?)

с массивом значений 1 , 2 а it's his затем я записываю строку a в файл резервной копии за этот час как

insert into T0(a,b,c) VALUES(1,2,'it's his');

Несколько вещей:

  1. Это только строки, которые нуждаются в побеге? У нас нет или не разрешены двоичные столбцы
  2. Существует ли библиотека Java, которая уже может это сделать (из экосистемы Spring, Apache или как-то иначе)?
  3. Я видел код JDBC Postgres для побега https://github.com/pgjdbc/pgjdbc/blob/master/pgjdbc/src/main/java/org/postgresql/core/Utils.java — этого достаточно?

Я также думал о создании базы данных SQLite на каждый час, записи в SQLite, а затем сбросе ее в hr.sql текстовый файл. Это имеет то преимущество, что позволяет извлечь выгоду из всей тяжелой работы и мыслей, уже вложенных в обработку SQLite, но кажется излишним, если есть способ выполнить строку toString в Java, а затем добавить строку в файл.

При использовании SQLite также учитывается производительность, что усиливает мои сомнения в выборе этого маршрута.

Комментарии:

1. JDBC уже обрабатывает побег. Проверьте подготовленное заявление .

2. Однако я не хочу выполнять подготовленный оператор, я хочу сериализовать его в строку. Я пропустил API в подготовленном классе операторов для этого? Насколько я знаю, обычно ты звонишь executeUpdate или что-то в этом роде…Это не то, чего я хочу. Запрос уже отправляется в базу данных, которая будет его обрабатывать. Это решение для резервного копирования за пределами БД…поскольку в нем нет решения, поддерживающего то, что мы хотим делать с резервными копиями.

Ответ №1:

Нашел несколько вариантов.

Драйвер Postgres JDBC — это https://github.com/pgjdbc/pgjdbc/blob/master/pgjdbc/src/main/java/org/postgresql/core/Utils.java и другие импл. еще проще https://github.com/p6spy/p6spy/blob/master/src/main/java/com/p6spy/engine/common/Value.java#L172 буквально делаю

 ESPECIAL_CHARACTER_PATTERN.matcher(stringValue).replaceAll("''")
 

Где private static final Pattern ESPECIAL_CHARACTER_PATTERN = Pattern.compile("'");

В обоих случаях это нужно только строкам, как я и думал, и двоичный файл обрабатывается отдельно, но у нас нет/нужен двоичный файл.

Копая дальше, я заново открыл ESAPI https://github.com/ESAPI/esapi-java-legacy У них есть библиотека для выхода из SQL https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html#defense-option-4-escaping-all-user-supplied-input

https://github.com/ESAPI/esapi-java-legacy/blob/develop/src/main/java/org/owasp/esapi/codecs/MySQLCodec.java