r - 限制在评估 (eval()) 用户输入以进行拼凑时可以执行的代码

标签 r security shiny

我已经在我的 Shiny 应用程序中实现了 Patchwork,通过它用户可以轻松地排列多个绘图。由于 Patchwork 的语法很简单,我想向用户显示一个 textInput,通过它他们可以发出“A + B”或“(A | B)/C”等 patchwork 命令。在我的代码中,它看起来像这样:eval(parse(text = input$patchwork_text))

然而,这会带来巨大的安全风险,因为用户可以执行任何代码。有没有一种好的方法可以确保 textInput 仅按预期使用?我不想放弃它所提供的灵活性。有什么办法可以将输入限制为几个符号(+、/、|、(、))和单个大写字符吗?我期待任何反馈:)

最佳答案

当然,让用户在 Shiny 的 session 中运行代码从来都不是一个好主意,但这就是我要做的,以检查是否只执行您想要允许的对象上的操作。

请注意,这只是一个开始,请扩展此功能。

我不确定是否给出了绘图对象的名称。如果它们是动态创建的,那么您需要获取它们并将名称作为字符串传递到 allowed_nms 参数中。否则,我们可以默认为 LETTERS,正如@Mikko 在评论中指出的那样。

一般来说,我建议不要使用字符串(和正则表达式),而是使用 str2lang 将字符串转换为调用对象,然后我们可以使用 all.vars() 和其他函数来检查调用。

check_call <- function(inp_string, allowed_nms = LETTERS) {
  
  allowed_fns <- c("+", "-", "/", "(", "|", "&")
  
  inp_call <- str2lang(inp_string)
  
  all_nms <- all.vars(inp_call)
  all_sym <- all.names(inp_call)
  all_fns <- setdiff(all_sym, all_nms)
  
  if (any(!all_fns %in% allowed_fns)) {
    stop("This operation is not allowed")
  }
  
  if (!is.null(allowed_nms) && any(!all_nms %in% allowed_nms)) {
    stop("Not allowed object name.")
  }
}

check_call("(A | B) / C")

check_call("(A | B) / z")
#> Error in check_call("(A | B) / z"): Not allowed object name.

check_call("system('rm -rf /')", allowed_nms = c("A", "B"))
#> Error in check_call("system('rm -rf /')", allowed_nms = c("A", "B")): This operation is not allowed

reprex package 于 2022 年 10 月 20 日创建(v2.0.1)

关于r - 限制在评估 (eval()) 用户输入以进行拼凑时可以执行的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74140005/

相关文章:

R:聚合事件之间的数据

安全、密码学 : Stupid Challenge - Response protocol?

javascript - 使用 ServiceWorker 的永久浏览器缓存

r - dplyr-0.6.0 编程取消引用

r - 使用 ggplot 的 100% 堆叠区域

ios - IPA包含我的源代码在IOS中的相对路径

r - pickerInput 默认选择所有选项

R Shiny HTML 对象在每个 tabPanel() 上呈现

r - 在 Windows 上托管 Shiny 的应用程序

r - 求R中对应元素的极差并求平均值