当前位置: 首页 > 面试题库 >

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

羊舌高爽
2023-03-14
问题内容

我有一个 特殊情况, 要求我根据用户提供的输入值生成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$
    

这样,您可以避免使用各种嵌套引用技术的麻烦, 并且 还可以通过使用随机标签来设置移动目标。

根据您的安全性要求,这可能做与否。:-)



 类似资料:
  • 问题内容: 我正在寻找SQL Server 的替代方案。是我最好的选择,还是可以使用另一种替代功能? 的替代方法也将很有用。 问题答案: 还不够,但是PHP的mssql软件包没有提供任何不错的选择。丑陋但完全通用的解决方案是将数据编码为十六进制字节串,即 摘要如下: 等效为。

  • 问题内容: 背景: 我目前正在为企业CMS数据库(业务对象)开发Java前端。目前,我正在构建一个功能,以允许用户构建自定义数据库查询。我已经实施了一些措施,以确保用户只能使用已批准用于用户访问的可用列和运算符的子集进行选择(例如,可以选择SI_EMAIL_ADDRESS,而不能选择更强大的字段,如SI_CUID)。到目前为止,事情一直在进行,但是现在是时候保护此功能免受潜在的SQL注入攻击。 问

  • 问题内容: 我正在读取Java中的源文件,但是当我打印它(sysout)时,转义的字符不再转义。如何在Java中转义像和这样的字符? 问题答案: 您应该使用Apache Commons Text中的类(您也可以在Apache Commons Lang3中找到该类,但已弃用该类)。您会发现Apache Commons中还有许多其他产品可能对您在Java开发中遇到的其他问题有用,因此您不必重新发明轮子

  • 问题内容: 我有一个Spring应用程序,该应用程序使用最初由Spring Roo创建的JPA( Hibernate )。我需要存储任意长度的字符串,因此,我用 @Lob 注释了该字段: 该应用程序可以在本地主机上正常运行,但是我已将其部署到外部服务器,并且出现了编码问题。因此,我想检查存储在PostgreSQL数据库中的数据是否正确。该应用程序自动创建/更新表。并且为该字段(消息)创建了一个类型

  • 问题内容: 如何在SQL Server的存储过程中转义字符串,以便可以在LIKE表达式中安全使用。 假设我有一个像这样的变量: 我想在LIKE表达式中使用它: 如何在T-SQL中转义字符串(更具体地说,是对LIKE模式匹配有意义的字符,例如%或?),以便可以安全地以这种方式使用? 例如,给定: 我想: 匹配,但没有或。 问题答案: 要在LIKE表达式中转义特殊字符,请在其前面加上转义字符。您可以选