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
可以在不知道查询的其余部分的情况下运行吗?如果我简单地连接上面代码的结果