java - 如何使用 Java 在 PostgreSQL 中安全地转义 SQL 的任意字符串

标签 java sql postgresql

我有一个特殊情况,要求我根据用户提供的输入值生成 SQL WHERE 子句的一部分。我想防止任何类型的 SQL 注入(inject)漏洞。我想出了以下代码:

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,它允许我注入(inject)自己的 X{} 函数,但这比仅使用 Jasper 的 $P!{} 语法生成动态 SQL where 子句要复杂得多。

  • 我查看了 OWASP libraries .他们还没有 PostgresSQL 编解码器。我看着 OracleCodec虽然它的转义看起来很简单。我不确定这对防止 SQL 注入(inject)攻击有多大帮助。

  • 在我的代码中,我添加了 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 个字符)(冗余)
  • 查看引号标签是否是输入字符串的一部分。
  • 如果是,重新计算一个新的随机标签。
  • 否则像这样构建您的查询:

    $tag$inputString$tag$
    

这样您就可以避免使用不同的嵌套引用技术带来的麻烦并且您还可以通过使用随机标签设置一个移动目标。

根据您的安全要求,这可能会完成这项工作。 :-)

关于java - 如何使用 Java 在 PostgreSQL 中安全地转义 SQL 的任意字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9741206/

相关文章:

带有 NAT 和动态 DNS 的 Java 服务器套接字

输出到 OpenGL(交互式)和 SVG(用于打印)的 Java 库

sql - 阻止 SQL Server Management Studio 打破我的观点

sql - 查找在 24 小时内创建的记录(尤其是最近 24 小时)

postgresql - 通过 kubernetes 作业创建或更新现有的 postgres 数据库容器

sql - 使用 PostgreSQL 按 3 列检查数据的唯一性

java - Apache Spark 中的执行器和核心

java - 为什么Java的类库不包含字符串连接方法?

php - 在 JOIN MySQL 中选择除元素之外的所有元素

sql - 如何使属性 setter 通过SQL函数发送值