【发布时间】:2012-04-02 05:29:18
【问题描述】:
我有一个特殊情况,要求我从用户提供的输入值生成 SQL WHERE 子句的一部分。我想防止任何类型的 SQL 注入漏洞。我想出了以下代码:
private String encodeSafeSqlStrForPostgresSQL(String str) {
//Replace all apostrophes with double apostrophes
String safeStr = str.replace("'", "''");
//Replace all backslashes with double backslashes
safeStr = safeStr.replace("\\", "\\\\");
//Replace all non-alphanumeric and punctuation characters (per ASCII only)
safeStr = safeStr.replaceAll("[^\\p{Alnum}\\p{Punct}]", "");
//Use PostgreSQL's special escape string modifier
safeStr = "E'" + safeStr + "'";
return safeStr;
}
问题:
- 您是否发现任何问题?
- 你们能提供更好的解决方案吗?
- 是否有任何现有的库可以帮助解决这个问题?
注意事项:
这是关于 SO 和其他地方的常见问题,但我看到的唯一答案是始终使用 PreparedStatements。 Fwiw,我正在使用 JasperReports。我想将查询保留在 JasperReports 中。用于查询参数处理的内置 Jasper 参数函数(包括 X{} 函数)不足以满足我需要参数化的内容。我可以尝试创建一个自定义 Jasper QueryExecutor,它允许我注入我自己的 X{} 函数,但这比使用 Jasper 的 $P!{} 语法生成动态 SQL where 子句更复杂。
我查看了OWASP libraries。他们还没有 PostgresSQL 编解码器。我查看了OracleCodec,但它的转义似乎很简单。我不确定这对防止 SQL 注入攻击有多大帮助。
在我的代码中,我添加了 E,以便不依赖于 PostgreSQL 的 standard_conforming_strings 设置。理想情况下,我不必添加它,然后该函数不必是 PostgreSQL 特定的。更多信息:http://www.postgresql.org/docs/9.0/static/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-ESCAPE。
理想情况下,我会想要一个更通用、更强大的解决方案,我知道它是安全的并支持所有可能的 UTF-8 字符串。
【问题讨论】:
-
BaseConnection.escapeString()似乎涵盖了这个jdbc.postgresql.org/development/privateapi/org/postgresql/core/… -
@FrankFarmer 查看 JDBC 驱动程序源代码的好主意。查看 BaseConnection 将我带到 Utils 类:jdbc.postgresql.org/development/privateapi/org/postgresql/core/…。查看源代码,他们打开符合标志,然后转义引号/撇号,类似于我所做的。他们只对 \0 字符进行特殊处理,并让其他所有内容都通过。所以...我想这是安全的,我删除 \0 之外的每个非标准字符是矫枉过正的?随意发表您的评论作为我可以接受的答案。
标签: java sql postgresql