对查询字符串的各个组件使用sqlInterpolate有意义吗?

对查询字符串的各个组件使用sqlInterpolate有意义吗?,sql,r,shiny,Sql,R,Shiny,TLDR:fromDBI包的sqlInterpolate是否必须知道整个sql查询才能正确清理用户输入 我正在使用DBI包在一个闪亮的应用程序中进行查询。由于应用程序允许自由文本输入,我需要清理输入。该应用程序最终会创建如下查询 # representative code query = "SELECT distinct oneColumn, anotherColumn where field1 in ('userInput1','userInput2'...'userInputN') ..."

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

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

# representative code
query = "SELECT distinct oneColumn, anotherColumn where field1 in ('userInput1','userInput2'...'userInputN') ..."
每个查询可以有任意数量的字段和任意数量的用户输入。根据教程,我似乎需要使用
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
是否可以在不知道查询其余部分的情况下运行?如果我简单地连接上面代码的结果,我会受到攻击吗