在查询字符串的各个组件上使用sqlInterpolate是否有意义?

时间:2017-06-20 08:31:44

标签: sql r shiny

TLDR:来自sqlInterpolate包的DBI是否必须知道整个sql查询才能正确清理用户输入?

我正在使用DBI包在闪亮的应用中进行查询。由于应用程序允许自由文本输入,我需要清理我的输入。该应用程序最终会创建这样的查询

# representative code
query = "SELECT distinct oneColumn, anotherColumn where field1 in ('userInput1','userInput2'...'userInputN') ..."

每个查询可以有任意数量的字段和任意数量的用户输入。根据{{​​3}}教程,我似乎需要使用sqlInterpolate来清理用户输入。然而,似乎该功能仅清理单个字符串。因此,为了按照指示使用函数,我必须将查询构造为

sql = "Select distinct oneColumn, anotherColumn where field1=?input1 OR field1=?input2"

然后做

sqlInterpolate(conn, sql, input1 = userInput1, input2 = userInput2)

由于字段和输入的数量是任意的,所以我只能这样做使用eval,这比现在更糟糕,而不是sql注入我现在很容易受到R注入。为了解决这个问题,我希望在个人用户输入上使用sqlInterpolate并将它们连接起来。像

query = userInputVector %>% apply(function(x){
    sqlInterpolate(conn, '?input',input = x)
})
paste0("('",paste(query,collapse = "','"),"')")

我的问题是这种方法是否有意义。 sqlInterpolate可以在不知道查询的其余部分的情况下运行吗?如果我简单地连接上面代码的结果

,我会接受攻击吗?

0 个答案:

没有答案