如何在JCR SQL2查询中转义动态生成的String值?

Lam*_*bda 3 java jackrabbit jcr jcr-sql2

让我假装我有一个像这样的JCR 2查询字符串:

String sql2Query = "SELECT * FROM [cq:PageContent] " +
                   "WHERE [aProperty] <> \" + aValue + "\"";
Run Code Online (Sandbox Code Playgroud)

是否有帮助方法可以逃脱aValue

顺便说一句,我已经知道在SQL2中我们可以使用占位符进行查询,让框架为我们处理值的转义,但如果我要动态创建这个查询,我怎么能逃避aValue以防止SQL注入以及建立破碎的查询?

Tho*_*ler 8

是的,您可以使用占位符.即使动态创建的查询也可以使用占位符.

对于SQL-2,您需要使用单引号,而不是双引号.例:

SELECT * FROM [cq:PageContent]
WHERE [aProperty] <> 'Joe''s Taxi'
Run Code Online (Sandbox Code Playgroud)

您只需要使用单引号转义字符转义单引号:

String aValue = "Joe's Taxi";
String sql2Query = "SELECT * FROM [cq:PageContent] " +
    "WHERE [aProperty] <> '" + aValue.replaceAll("'", "''") + "'";
Run Code Online (Sandbox Code Playgroud)

如果要使用XPath,可以使用单引号或双引号,但通常也使用单引号(与SQL-2中的相同).XPath查询当前不支持占位符.

  • org.apache.jackrabbit.oak.query.SQL2Parser.escapeStringLiteral(“转义字符串”)提供了相同的解决方案(可以与groupId:org.apache.jackrabbit和artifactId:oak-core一起添加) (3认同)