【发布时间】:2015-02-18 14:39:12
【问题描述】:
我有来自 Java 的 String 变量(例如,str),它存储了一些 GString 表达式,比如说 "SELECT ${path} path FROM dual",它绝对是来自用户输入的动态字符串,我不知道,如何许多${}会在那里。
我不想在sql.rows() 中使用它,并通过使用PreparedStatement 的当前绑定评估${path}。
问题是:
- 如果我不以某种方式将
str转换为GString,它将抛出SQLException,因为没有PreparedStatement,我们需要在'${path}'周围使用引号。但它不安全,而且 Groovy 会生成警告(我们应该使用PreparedStatement并删除引号)。 - 如果我将
str转换为GString这种方式:sql.rows("${str}"),那么Groovy 将使用完全错误的准备语句,其中只包含"?",当然,它不会工作,我需要语句:@ 987654340@.
问题是我们如何在不使用"${}" 包装的情况下从String 获得GString?或者我们如何仅评估GString 的第一级(仅str,而不是path)?或者我该如何以其他方式解决这个问题?
谢谢。
【问题讨论】:
-
这里有很多例子:jira.codehaus.org/browse/GROOVY-2505;但一定要清理查询,否则你会得到一些 SQL 注入
-
@cfrick,这个(不是评估)示例在我的情况下不起作用,它至少违反了我的“问题”中的一点。 eval 示例不起作用,因为我的字符串有 ',' 字符并且 eval 抛出异常。
-
您能否举一个无法评估的字符串示例以及最终的 GString 应该是什么样子?
-
@blackdrag,无法评估:
"SELECT '123' test\n, ${path} path FROM dual",最终的 GString 应该看起来像:"SELECT '123' test\n, ${path} path FROM dual"(就像字符串一样,我需要在不做任何更改的情况下转换它,以便在sql.rows中使用(当然没有评估${path},因为我需要使用自动sql.rows准备好的语句机制)。 -
以及为什么 def gstring = Eval.me(/"str"/) 不起作用?,除非您直接评估,否则我认为逗号不会导致问题。但这将是 Eval.me(str) 然后
标签: java string groovy gstring