转义 Java 变量以将 SQL 语句序列化为字符串
Escaping Java variables to serialise SQL statement to string
我们有一个事件系统生成用于更改数据捕获的数据库事件。
系统发送一个事件,其中包含带有 ?
占位符的 INSERT 或 UPDATE 语句以及与每个问号匹配的有序值数组。
我想将它用于每小时备份文件,所以如果我收到如下语句:
insert into T0(a,b,c) VALUES(?,?,?)
使用一组值 1
、2
和 it's his
,然后我将那一小时的一行写入备份文件,如
insert into T0(a,b,c) VALUES(1,2,'it\'s his');
几件事:
- 是否只有字符串需要转义?我们没有或不允许二进制列
- 是否有 Java 库可以做到这一点(来自 Spring 生态系统,Apache 或其他)?
- 我看过 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
我们有一个事件系统生成用于更改数据捕获的数据库事件。
系统发送一个事件,其中包含带有 ?
占位符的 INSERT 或 UPDATE 语句以及与每个问号匹配的有序值数组。
我想将它用于每小时备份文件,所以如果我收到如下语句:
insert into T0(a,b,c) VALUES(?,?,?)
使用一组值 1
、2
和 it's his
,然后我将那一小时的一行写入备份文件,如
insert into T0(a,b,c) VALUES(1,2,'it\'s his');
几件事:
- 是否只有字符串需要转义?我们没有或不允许二进制列
- 是否有 Java 库可以做到这一点(来自 Spring 生态系统,Apache 或其他)?
- 我看过 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