转义 Java 变量以将 SQL 语句序列化为字符串

Escaping Java variables to serialise SQL statement to string

我们有一个事件系统生成用于更改数据捕获的数据库事件。

系统发送一个事件,其中包含带有 ? 占位符的 INSERT 或 UPDATE 语句以及与每个问号匹配的有序值数组。

我想将它用于每小时备份文件,所以如果我收到如下语句:

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

使用一组值 12it's his,然后我将那一小时的一行写入备份文件,如

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

几件事:

  1. 是否只有字符串需要转义?我们没有或不允许二进制列
  2. 是否有 Java 库可以做到这一点(来自 Spring 生态系统,Apache 或其他)?
  3. 我看过 Postgres JDBC 转义代码 https://github.com/pgjdbc/pgjdbc/blob/master/pgjdbc/src/main/java/org/postgresql/core/Utils.java - 够了吗?

我也在考虑为每个小时创建一个 SQLite 数据库,写入 SQLite,然后将其转储到 hr.sql 文本文件。这样做的好处是可以利用已经投入 SQLite 处理转义的所有努力和想法,但如果有一种方法可以在 Java 中执行 toString 然后在文件中追加一行,则感觉有点矫枉过正。

在使用 SQLite 时还有性能方面的考虑,这也让我对那条路线犹豫不决。

找到一些选项。

Postgres JDBC 驱动就是这个 https://github.com/pgjdbc/pgjdbc/blob/master/pgjdbc/src/main/java/org/postgresql/core/Utils.java and other impl. is even more simple 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("'");

在这两种情况下,正如我所想,只有字符串需要这个,二进制文件是单独处理的,但我们不需要 have/need 二进制文件。

进一步挖掘我重新发现了 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