如何使用Java在PostgreSQL中安全地转义SQL的任意字符串
我有一个 特殊情况, 要求我根据用户提供的输入值生成SQL WHERE子句的一部分。我想防止任何形式的SQL Injection漏洞。我想出了以下代码:
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库。他们还没有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字符串。
回答:
最简单的方法是结合使用PostgreSQL的Dollar
Quoting和一个小的 随机 标记:
对于每次调用,请计算一个小的随机标签(例如4个字符)(冗余)- 查看quote标记是否是输入字符串的一部分。
- 如果是,请重新计算一个新的随机标签。
- 否则,像这样构建您的查询:
$tag$inputString$tag$
这样,您可以避免使用各种嵌套引用技术的麻烦, 还可以通过使用随机标签来设置移动目标。
根据您的安全性要求,这可能做与否。:-)
以上是 如何使用Java在PostgreSQL中安全地转义SQL的任意字符串 的全部内容, 来源链接: utcz.com/qa/403029.html