首页 > 解决方案 > 这款带有 csv 上传功能的 R-Shiny 是否存在安全漏洞?

问题描述

我有一个简单的 Shiny 应用程序,允许上传一个简单的 csv 文件。

它期望 csv 文件在每行中有 5 个逗号分隔的数字。

然后它将这个文件显示给用户。

这是代码:

library(shiny)

ui <- fluidPage(
  fluidRow(
    column(
      2, wellPanel(
        fileInput("file1", "Choose csv file:",
                  multiple = FALSE,
                  accept = c("text/csv",
                             "text/comma-separated-values,text/plain",
                             ".csv")
        )
      )
    )
  ),
  fluidRow(
    column(
      2, tableOutput(outputId = "contents")
    )
  )
)

server <- function(input, output, session) {

  uploaded <- reactive({

    req(input$file1)

    df <- read.csv(input$file1$datapath,
                   header = FALSE,
                   col.names = c("a", "b", "c", "d", "e"),
                   colClasses = rep("numeric", 5))
    return(df)
  })

  output$contents <- renderTable({
    uploaded()
  })
}

shinyApp(ui = ui, server = server)

如您所见,没有错误处理。如果用户上传的文件与应用程序期望的不同,这可能会导致意外结果。我同意 - 我希望用户在使用这个应用程序时会表现得很好。

这会导致某种安全漏洞吗?我的想法是,因为read.csv()需要 5 个数字列,所以任何不是 5 个数字列的东西都将只是一堆无用的NA. 但是,我在安全方面几乎没有经验,所以我可能对此非常错误。

标签: rsecurityshinyxssshiny-reactivity

解决方案


推荐阅读