我已經在我的 Shiny 應用程式中實作了 Patchwork,用戶可以通過它輕松地安排多個繪圖。由于 Patchwork 的語法很簡單,我想向用戶顯示一個 textInput,通過它他們可以發出“A B”或“(A | B) / C”的拼湊命令。在我的代碼中,這看起來像這樣:eval(parse(text = input$patchwork_text))
然而,這帶來了巨大的安全風險,因為任何代碼都可以由用戶執行。有沒有一種好方法可以確保 textInput 僅按預期使用?我不想放棄它提供的靈活性。是否可以將輸入限制為幾個符號( 、/、|、(、))和單個大寫字符?我期待任何反饋:)
uj5u.com熱心網友回復:
當然,讓用戶在閃亮的會話中運行代碼絕不是一個好主意,但我會這樣做以檢查是否只執行對您想要允許的物件的操作。
請注意,這只是一個開始,請擴展此功能。
我不確定是否給出了情節物件的名稱。如果它們是動態創建的,那么您需要獲取它們并將名稱作為字串傳遞給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 包于 2022-10-20 創建(v2.0.1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/519778.html
標籤:r安全闪亮的
